Hutool JSON 操作教程

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;
}

注意事项

  1. 性能:高频场景下,考虑使用 Jackson 或 Fastjson 以获得更好性能

  2. 类型安全 :使用 getXXX() 方法时注意类型匹配

  3. 循环引用:Hutool JSON 默认会处理循环引用问题

  4. null 处理 :getStr() 等方法返回 null 而非抛出异常

Hutool 的 JSON 工具简单易用,适合大部分日常开发场景。

相关推荐
SEO_juper7 分钟前
用 Python 写一个 GEO 可见性检查脚本:你的网站现在能被 AI 引用吗
开发语言·人工智能·爬虫·python·seo·外贸独立站
java资料站32 分钟前
二、Spring AI Alibaba · ChatModel
java·windows·spring
用户8356290780511 小时前
使用 Python 对 Excel 工作表进行排序
后端·python
北冥you鱼2 小时前
Go 语言空接口(interface{})使用场景与最佳实践
开发语言·windows·golang
for_ever_love__2 小时前
MySQL 全文索引实战:FULLTEXT、ngram 中文分词与 MATCH AGAINST 到底该怎么用
java·python·mysql·全文检索·分词·索引·ngram
用户8356290780512 小时前
使用 Python 合并 PowerPoint 演示文稿
后端·python
weixin_461769402 小时前
VS Code 中创建 Jupyter 文件(.ipynb)
ide·python·jupyter
2601_966949652 小时前
多市场量化策略的数据接口应该如何设计:从数据层架构到策略接入
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
全栈弄潮儿2 小时前
Python实战第1期:Python环境搭建与第一个程序
python
心易行者2 小时前
Agent应用+API端点商业化进阶实战:从单体智能体到可付费调用的API全流程
运维·服务器·人工智能·python·apache