Hutool 提供了简洁强大的 JSON 工具类,主要包括 JSONUtil 和 JSONObject/JSONArray。
1. 引入依赖
XML
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.26</version>
</dependency>
2. 创建 JSON 对象
2.1 直接创建
java
// 创建 JSONObject
JSONObject json = JSONUtil.createObj();
json.set("name", "张三");
json.set("age", 25);
json.set("score", 99.5);
System.out.println(json); // {"name":"张三","age":25,"score":99.5}
// 链式调用
JSONObject json2 = JSONUtil.createObj()
.set("name", "李四")
.set("age", 30);
2.2 从 Map 创建
java
Map<String, Object> map = new HashMap<>();
map.put("name", "王五");
map.put("age", 28);
JSONObject json = JSONUtil.parseObj(map);
2.3 从 Java Bean 创建
java
User user = new User("赵六", 35, "北京");
JSONObject json = JSONUtil.parseObj(user);
// 忽略 null 值
JSONObject json2 = JSONUtil.parseObj(user, false);
3. 创建 JSON 数组
java
// 直接创建
JSONArray array = JSONUtil.createArray();
array.add("苹果");
array.add("香蕉");
array.add("橙子");
// 从 List 创建
List<String> list = Arrays.asList("A", "B", "C");
JSONArray array2 = JSONUtil.parseArray(list);
// 从数组创建
String[] arr = {"x", "y", "z"};
JSONArray array3 = JSONUtil.parseArray(arr);
4. 字符串与 JSON 互转
4.1 字符串转 JSON
java
String jsonStr = "{\"name\":\"张三\",\"age\":25}";
// 转 JSONObject
JSONObject json = JSONUtil.parseObj(jsonStr);
// 转 JSONArray
String arrayStr = "[1,2,3,4]";
JSONArray array = JSONUtil.parseArray(arrayStr);
4.2 JSON 转字符串
java
JSONObject json = JSONUtil.createObj()
.set("name", "张三")
.set("age", 25);
// 转字符串(无格式)
String str = json.toString();
// 格式化输出(带缩进)
String prettyStr = json.toStringPretty();
5. JSON 与 Bean 互转
5.1 JSON 转 Bean
java
String jsonStr = "{\"name\":\"张三\",\"age\":25,\"address\":\"北京\"}";
User user = JSONUtil.toBean(jsonStr, User.class);
// 泛型嵌套
String resultStr = "{\"code\":200,\"data\":{\"name\":\"李四\"}}";
Result<User> result = JSONUtil.toBean(resultStr,
new TypeReference<Result<User>>() {}, false);
5.2 Bean 转 JSON
java
User user = new User("王五", 30, "上海");
JSONObject json = JSONUtil.parseObj(user);
String jsonStr = JSONUtil.toJsonStr(user); // 直接转字符串
6. JSON 取值操作
java
JSONObject json = JSONUtil.parseObj("{\"name\":\"张三\",\"age\":25,\"scores\":[90,85,95]}");
// 获取值
String name = json.getStr("name"); // "张三"
Integer age = json.getInt("age"); // 25
Double score = json.getDouble("score"); // null 不抛异常
// 带默认值
String city = json.getStr("city", "未知");
// 获取 JSONArray
JSONArray scores = json.getJSONArray("scores");
int firstScore = scores.getInt(0); // 90
7. JSON 修改操作
java
JSONObject json = JSONUtil.createObj();
json.set("name", "张三");
json.set("age", 25);
// 修改值
json.set("age", 26);
// 删除键
json.remove("age");
// 清空
json.clear();
// 判空
boolean empty = json.isEmpty();
8. XML 转 JSON
java
String xml = "<user><name>张三</name><age>25</age></user>";
JSONObject json = JSONUtil.parseFromXml(xml);
// JSON 转 XML
String backToXml = JSONUtil.toXmlStr(json);
9. JSON 路径操作
java
String jsonStr = "{\"store\":{\"book\":[{\"title\":\"Java编程\"},{\"title\":\"Python入门\"}]}}";
JSONObject json = JSONUtil.parseObj(jsonStr);
// 使用 JSONPath 获取值
Object titles = JSONUtil.getByPath(json, "$.store.book[*].title");
// 返回 ["Java编程", "Python入门"]
10. 实用工具方法
java
// 判断是否为 JSON
boolean isJson = JSONUtil.isJson("{\"key\":\"value\"}");
// 判断是否为 JSONObject
boolean isObj = JSONUtil.isJsonObj("{\"key\":\"value\"}");
// 判断是否为 JSONArray
boolean isArray = JSONUtil.isJsonArray("[1,2,3]");
// 格式化 JSON 字符串
String ugly = "{\"a\":1,\"b\":2}";
String pretty = JSONUtil.formatJsonStr(ugly);
11. 完整示例
java
public class HutoolJsonDemo {
public static void main(String[] args) {
// 1. 创建嵌套 JSON
JSONObject root = JSONUtil.createObj()
.set("code", 200)
.set("message", "success")
.set("data", JSONUtil.createObj()
.set("userId", 1001)
.set("userName", "张三")
.set("roles", JSONUtil.createArray()
.add("admin")
.add("user")));
// 2. 格式化输出
System.out.println(root.toStringPretty());
// 3. 获取数据
String userName = root.getJSONObject("data").getStr("userName");
System.out.println("用户名: " + userName);
// 4. 转 Java Bean
User user = root.getJSONObject("data").toBean(User.class);
System.out.println(user);
// 5. 遍历 JSONArray
JSONArray roles = root.getJSONObject("data").getJSONArray("roles");
roles.forEach(role -> System.out.println("角色: " + role));
}
}
@Data
@AllArgsConstructor
@NoArgsConstructor
class User {
private Integer userId;
private String userName;
private List<String> roles;
}
注意事项
-
性能:高频场景下,考虑使用 Jackson 或 Fastjson 以获得更好性能
-
类型安全 :使用
getXXX()方法时注意类型匹配 -
循环引用:Hutool JSON 默认会处理循环引用问题
-
null 处理 :
getStr()等方法返回 null 而非抛出异常
Hutool 的 JSON 工具简单易用,适合大部分日常开发场景。