00-Json:hutool

Java 中并没有内置 JSON 的解析,因此使用 JSON 需要借助第三方类库。 下面是几个常用的 JSON 解析类库:

  • Gson: 谷歌开发的 JSON 库,功能十分全面。
  • FastJson: 阿里巴巴开发的 JSON 库,性能十分优秀。
  • Jackson: 社区十分活跃且更新速度很快。
  • hutool: 一个小而全的Java工具类库,里面有 JSON 模块。

1、Hutool 简介

官方简介:Hutool 是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。

2、Hutool-json 简介

官方将 json.org 官方的 JSON 解析纳入其中,进行改造。在改造过程中,积极吸取其它类库优点,优化成员方法,抽象接口和类,最终形成 Hutool-json。

Hutool-json的核心类只有两个:

  • JSONObject:JSON 对象
  • JSONArray:这与其它JSON包是类似的,与此同时,还提供一个JSONUtil工具类用于简化针对JSON的各种操作和转换。

除了核心类,还提供了一些辅助类用于实现特定功能:

  • JSONSupport:Bean类继承此对象即可无缝转换为JSON或JSON字符串。同时实现了toString()方法可将当前对象输出为JSON字符串。
  • XML:提供JSON与XML之间的快速转换,同时JSONUtil中有相应静态封装。
  • JSON JSONObject和JSONArray共同实现的接口类,JSONUtil.parse方法默认返回此对象(因为不知道是JSON对象还是JSON数组),然后可以根据实际类型判断后转换对象类型。

与FastJSON类似,JSONObject实现了Map接口,JSONArray实现了List接口,这样我们便可以使用熟悉的API来操作JSON。

JSONUtil 是针对 JSONObject 和 JSONArray 的静态快捷方法集合。

以下是 Hutool 中关于 JSON 的常用方法:

JSON 字符串的解析与生成:

  • JSONUtil.parseObj(jsonStr):将 JSON 字符串解析为 JSONObject 对象。
  • JSONUtil.parseArray(jsonStr):将 JSON 字符串解析为 JSONArray 数组对象。
  • JSONUtil.toJsonStr(obj):将 Java 对象转换为 JSON 字符串。

对象与 JSON 字符串的转换:

  • JSONUtil.toBean(jsonStr, clazz):将 JSON 字符串转换为指定类型的 Java 对象。
  • JSONUtil.toMap(jsonStr):将 JSON 字符串转换为 Map 对象。
  • JSONUtil.toCamelCaseMap(bean):将 Java 对象转换为驼峰风格的 Map 对象,适用于大部分 JavaBean。

JSON 对象的操作:

  • JSONObject.get(key):获取 JSON 对象中指定 key 的值。
  • JSONObject.put(key, value):向 JSON 对象中添加键值对。
  • JSONObject.containsKey(key):判断 JSON 对象中是否包含指定的 key。
  • JSONObject.keySet():获取 JSON 对象中所有键的集合。

JSON 数组的操作:

  • JSONArray.get(index):获取 JSON 数组中指定索引的元素。
  • JSONArray.add(value):向 JSON 数组中添加元素。
  • JSONArray.size():获取 JSON 数组的长度。
  • JSONArray.iterator():获取 JSON 数组的迭代器。

其他常用方法:

  • JSONUtil.parseFromXml(xmlStr):将 XML 字符串解析为 JSON 对象。
  • JSONUtil.toXmlStr(jsonObject):将 JSON 对象转换为 XML 字符串。

3、示例

1、JSONUtil.toJsonStr 将任意对象(Bean、Map、集合等)直接转换为 JSON 字符串

JSONUtil.toJsonStr 可以将任意对象(Bean、Map、集合等)直接转换为 JSON 字符串。如果对象是有序的 Map 等对象,则转换后的 JSON 字符串也是有序的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/**
* 转换为JSON字符串
*
* 被转为JSON的对象
*
* @return JSON字符串
*/
@Test
void toJsonStrTest() {
//map
SortedMap<Object, Object> sortedMap = new TreeMap<Object, Object>() {
private static final long serialVersionUID = 1L;
{
put("attributes", "a");
put("b", "b");
put("c", "c");
}
};
//对象
Student beanString = new Student(1, 1, 1, "张三");

//集合
List<Student> list = new ArrayList<>();
list.add(new Student(1, 1, 1, "张三"));
list.add(new Student(1, 1, 2, "李四"));
list.add(new Student(1, 1, 3, "王五"));

System.out.println("JSONUtil.toJsonStr(beanString) = " + JSONUtil.toJsonStr(beanString));
System.out.println("JSONUtil.toJsonStr(sortedMap) = " + JSONUtil.toJsonStr(sortedMap));
System.out.println("JSONUtil.toJsonStr(list) = " + JSONUtil.toJsonStr(list));
}

结果

1
2
3
4
5
JSONUtil.toJsonStr(beanString) = {"gradeId":0,"studentId":1,"termId":1,"classId":1,"name":"张三"}  
JSONUtil.toJsonStr(sortedMap) = {"attributes":"a","b":"b","c":"c"}
JSONUtil.toJsonStr(list) = [{"gradeId":0,"studentId":1,"termId":1,"classId":1,"name":"张三"},
{"gradeId":0,"studentId":2,"termId":1,"classId":1,"name":"李四"},
{"gradeId":0,"studentId":3,"termId":1,"classId":1,"name":"王五"}]

如果我们想获得格式化后的 JSON ,则:

1
2
3
JSONUtil.toJsonPrettyStr(object);

System.out.println("JSONUtil.toJsonPrettyStr(sortedMap) = " + JSONUtil.toJsonPrettyStr(sortedMap));

结果

1
2
3
4
5
JSONUtil.toJsonPrettyStr(sortedMap) = {  
"attributes": "a",
"b": "b",
"c": "c"
}

2、 JSONUtil.parseObj JSON 字符串解析

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* JSON字符串转JSONObject对象
*
* JSON字符串
*
* @return JSONObject
*/
@Test
void Test() {
String html = "{\"name\":\"Something must have been changed since you leave\"}";
JSONObject jsonObject = JSONUtil.parseObj(html);
System.out.println("jsonObject.getStr(\"name\") = " + jsonObject.getStr("name"));
}

结果

1
jsonObject.getStr("name") = Something must have been changed since you leave

3、JSONUtil.parseFromXml XML字符串转换为JSON

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* XML字符串转为JSONObject
*
* XML字符串
* @return JSONObject
*/
@Test
void parseFromXmlTest() {
String s = "<sfzh>123</sfzh><sfz>456</sfz><name>aa</name><gender>1</gender>";
JSONObject json = JSONUtil.parseFromXml(s);
System.out.println("json.get(\"sfzh\") = " + json.get("sfzh"));
System.out.println("json.get(\"name\") = " + json.get("name"));

}

结果

1
2
json.get("sfzh") = 123  
json.get("name") = aa

4、JSONUtil.toXmlStr JSON 转换为 XML

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* 转换为XML字符串
*
* @param json JSON
* @return XML字符串
*/
@Test
void toXmlStrTest() {
final JSONObject put = JSONUtil.createObj()
.set("aaa", "你好")
.set("键2", "test");

// <aaa>你好</aaa><键2>test</键2>
final String s = JSONUtil.toXmlStr(put);
System.out.println("s = " + s);
}

结果

1
s = <aaa>你好</aaa><键2>test</键2>

5、 JSON转Bean

我们先定义两个较为复杂的Bean(包含泛型)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@Data
public class ADT {
private List<String> BookingCode;
}

@Data
public class Price {
private List<List<ADT>> ADT;
}

/**
* JSON字符串转为实体类对象,转换异常将被抛出
*
* @param <T> Bean类型
* @param jsonString JSON字符串
* @param beanClass 实体类对象
* @return 实体类对象
* @since 3.1.2
*/
@Test
void toBeanTest() {
String json = "{\"ADT\":[[{\"BookingCode\":[\"N\",\"N\"]}]]}";
Price price = JSONUtil.toBean(json, Price.class);
System.out.println("price = " + price);
}

00-Json:hutool
https://flepeng.github.io/021-Java-31-API-00-Json:hutool/
作者
Lepeng
发布于
2023年3月23日
许可协议