JSON(Hutool-json)中的数据结构

发布时间 2023-05-24 19:45:17作者: 沙里

JSON(Hutool-json)中的数据结构

我们知道 json 串的复合数据类型仅有 2 种:数组[],对象{},所以 hutool 也定义了 2 种复合类型:cn.hutool.json.JSONArraycn.hutool.json.JSONObject

cn.hutool.json.JSONArray 是 List,cn.hutool.json.JSONObject 是 Map

// JSONObject 底层是 Map,JSONArray 底层是 List
String json = "{\"name\":\"lisa\",\"score\":[70,90]}";
JSONObject jsonObject = JSONUtil.parseObj(json);
Assertions.assertTrue(jsonObject instanceof Map);
Assertions.assertTrue(jsonObject.get("name") instanceof String);
Object obj = jsonObject.get("score");
Assertions.assertTrue(obj instanceof JSONArray);
Assertions.assertTrue(obj instanceof List);
Assertions.assertFalse(obj instanceof Array);

JSONObject 底层到底是什么 Map,JSONArray 底层是什么 List ?

chat gpt:

cn.hutool.json.JSONArray 底层使用的是一个数组(Array)数据结构,它是一个有序集合,可以存储多个元素。在JSONArray中,每个元素也可以是一个JSONArray对象,表示一个嵌套的数组结构。该数据结构的特点是支持快速的随机访问,因为它可以根据元素的下标来获取对应的值。另外,JSONArray还提供了一些方法用于操作和管理其中的元素,如添加、删除、替换等操作。
根据Hutool官方文档,cn.hutool.json.JSONObject底层的数据结构是HashMap,它使用键值对存储数据,并且允许null值和重复的键。因此,JSONObject可以存储任意类型的数据并提供了方便的JSON格式的序列化和反序列化方法。此外,JSONObject还实现了Map接口,可以像Map一样使用put、get、containsKey等方法来操作JSON数据。

看来 gpt 说的不对,看源码却说在二者中间:

JSONObject 底层存储数据的可能是 HashMap 也可能是 LinkedHashMap

取决于数据是否有序。

cn.hutool.core.map.MapUtil#newHashMap(int, boolean)

JSONArray 底层存储数据的是 ArrayList