概述

Hutool-json


为何集成

JSON在现在的开发中做为跨平台的数据交换格式已经慢慢有替代XML的趋势(比如RestFul规范),我想大家在开发中对外提供接口也越来越多的使用JSON格式。
不可否认,现在优秀的JSON框架非常多,我经常使用的像阿里的FastJSON,Jackson等都是非常优秀的包,性能突出,简单易用。Hutool开始也并不想自己写一个JSON,但是在各种工具的封装中,发现JSON已经不可或缺,因此将json.org官方的JSON解析纳入其中,进行改造。在改造过程中,积极吸取其它类库优点,优化成员方法,抽象接口和类,最终形成Hutool-json。

介绍

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

  • JSONObject
  • 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。
在JSON中,Hutool封装了getXXX方法,支持大部分内置类型的值获取操作。比如:

  1. JSONObject json1 = JSONUtil.createObj();
  2. json1.getStr("key");
  3. json1.getInt("key");
  4. json1.getLong("key");
  5. json1.getDouble("key");
  6. json1.getBigDecimal("key");

这些成员方法的加入,可以省掉大量的类型转换代码,大大提高JSON的操作简便性。

JSON工具-JSONUtil

JSONUtil

介绍

JSONUtil是针对JSONObject和JSONArray的静态快捷方法集合,在之前的章节我们已经介绍了一些工具方法,在本章节我们将做一些补充。

使用

parseXXX和toXXX

这两种方法主要是针对JSON和其它对象之间的转换。

readXXX

这类方法主要是从JSON文件中读取JSON对象的快捷方法。包括:

  • readJSON
  • readJSONObject
  • readJSONArray

    其它方法

    除了上面中常用的一些方法,JSONUtil还提供了一些JSON辅助方法:

  • quote 对所有双引号做转义处理(使用双反斜杠做转义)

  • wrap 包装对象,可以将普通任意对象转为JSON对象
  • formatJsonStr 格式化JSON字符串,此方法并不严格检查JSON的格式正确与否

    JSON对象-JSONObject

JSONObject

介绍

JSONObject代表一个JSON中的键值对象,这个对象以大括号包围,每个键值对使用,隔开,键与值使用:隔开,一个JSONObject类似于这样:

  1. {
  2. "key1":"value1",
  3. "key2":"value2"
  4. }

此处键部分可以省略双引号,值为字符串时不能省略,为数字或波尔值时不加双引号。

使用

创建

  1. JSONObject json1 = JSONUtil.createObj()
  2. .put("a", "value1")
  3. .put("b", "value2")
  4. .put("c", "value3");

JSONUtil.createObj()是快捷新建JSONObject的工具方法,同样我们可以直接new:

  1. JSONObject json1 = new JSONObject();
  2. ...

转换

  1. JSON字符串解析
    1. String jsonStr = "{\"b\":\"value2\",\"c\":\"value3\",\"a\":\"value1\"}";
    2. //方法一:使用工具类转换
    3. JSONObject jsonObject = JSONUtil.parseObj(jsonStr);
    4. //方法二:new的方式转换
    5. JSONObject jsonObject2 = new JSONObject(jsonStr);
    //JSON对象转字符串(一行) jsonObject.toString();
    // 也可以美化一下,即显示出带缩进的JSON: jsonObject.toStringPretty(); ```java
  2. JavaBean解析 首先我们定义一个Bean
    1. // 注解使用Lombok
    2. @Data
    3. public class UserA {
    4. private String name;
    5. private String a;
    6. private Date date;
    7. private List<Seq> sqs;
    8. }
    解析为JSON:
    1. UserA userA = new UserA();
    2. userA.setName("nameTest");
    3. userA.setDate(new Date());
    4. userA.setSqs(CollectionUtil.newArrayList(new Seq(null), new Seq("seq2")));
    5. // false表示不跳过空值
    6. JSONObject json = JSONUtil.parseObj(userA, false);
    7. Console.log(json.toStringPretty());
    结果:
    1. {
    2. "date": 1585618492295,
    3. "a": null,
    4. "sqs": [
    5. {
    6. "seq": null
    7. },
    8. {
    9. "seq": "seq2"
    10. }
    11. ],
    12. "name": "nameTest"
    13. }
    可以看到,输出的字段顺序和Bean的字段顺序不一致,如果想保持一致,可以:
    1. // 第二个参数表示保持有序
    2. JSONObject json = JSONUtil.parseObj(userA, false, true);
    结果:
    1. {
    2. "name": "nameTest",
    3. "a": null,
    4. "date": 1585618648523,
    5. "sqs": [
    6. {
    7. "seq": null
    8. },
    9. {
    10. "seq": "seq2"
    11. }
    12. ]
    13. }
    默认的,Hutool将日期输出为时间戳,如果需要自定义日期格式,可以调用:
    1. json.setDateFormat("yyyy-MM-dd HH:mm:ss");
    得到结果为:
    1. {
    2. "name": "nameTest",
    3. "a": null,
    4. "date": "2020-03-31 09:41:29",
    5. "sqs": [
    6. {
    7. "seq": null
    8. },
    9. {
    10. "seq": "seq2"
    11. }
    12. ]
    13. }
    同样,JSONUtil还可以支持以下对象转为JSONObject对象:
  • String对象
  • Java Bean对象
  • Map对象
  • XML字符串(使用JSONUtil.parseFromXml方法)
  • ResourceBundle(使用JSONUtil.parseFromResourceBundle)

JSONUtil还提供了JSONObject对象转换为其它对象的方法:

  • toJsonStr 转换为JSON字符串
  • toXmlStr 转换为XML字符串
  • toBean 转换为JavaBean

    JSON数组-JSONArray

JSONArray

介绍

在JSON中,JSONArray代表一个数组,使用中括号包围,每个元素使用逗号隔开。一个JSONArray类似于这样:

  1. ["value1","value2","value3"]

使用

创建

  1. //方法1
  2. JSONArray array = JSONUtil.createArray();
  3. //方法2
  4. JSONArray array = new JSONArray();
  5. array.add("value1");
  6. array.add("value2");
  7. array.add("value3");
  8. //转为JSONArray字符串
  9. array.toString();

转换

  1. String jsonStr = "[\"value1\", \"value2\", \"value3\"]";
  2. JSONArray array = JSONUtil.parseArray(jsonStr);