目錄
1. 說明
JSON 數據本身是無序的,通常由字符串生成的 JSONObject 也是無序的
(底層通常是 HashMap 存儲,由字符串生成的是一種默認排序)
如果想 JSONObject 節點的順序與字符串原本的順序保持一致,可以藉助 fastjson 很容易地實現
2. 引入依賴
pom 配置如下:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.54</version>
</dependency>
3. 字符串轉換成 JSONObject
最重要的是用下面的方法,第一個參數是要轉換的字符串,第二個參數是處理類,第三個參數設置有序
JSONObject jsonObject = JSONObject.parseObject(data, JSONObject.class, Feature.OrderedField);
示例:
package com.amwalle.walle.util;
import com.alibaba.fastjson.*;
import com.alibaba.fastjson.parser.Feature;
public class JSONTree {
public static List<JSONNode> depthFirstTraversal(JSONNode rootNode) {
if (rootNode == null) {
return null;
}
Stack<JSONNode> stack = new Stack<>();
stack.push(rootNode);
List<JSONNode> nodeList = new LinkedList<>();
while (!stack.isEmpty()) {
JSONNode node = stack.pop();
nodeList.add(node);
if (node == null || node.getChildren() == null) {
continue;
}
List<JSONNode> children = node.getChildren();
for (int index = children.size() - 1; index >= 0; index--) {
stack.push(children.get(index));
}
}
return nodeList;
}
public static void main(String[] args) {
String data = "{\n" +
" \"checked\": false,\n" +
" \"dimensions\": {\n" +
" \"width\": 5,\n" +
" \"height\": 10\n" +
" },\n" +
" \"id\": 1,\n" +
" \"name\": \"A green door\",\n" +
" \"price\": 12.5,\n" +
" \"tags\": [\n" +
" \"home\",\n" +
" \"green\"\n" +
" ]\n" +
"}";
JSONObject jsonObject = JSONObject.parseObject(data, JSONObject.class, Feature.OrderedField);
JSONObject jsonObject1 = JSONObject.parseObject(data);
System.out.println(jsonObject.toJSONString());
System.out.println(jsonObject1.toJSONString());
}
}
4. 結果對比
可以看出,第一種轉換方式得到的順序與字符串原來的順序一致:
{"checked":false,"dimensions":{"width":5,"height":10},"id":1,"name":"A green door","price":12.5,"tags":["home","green"]}
{"price":12.5,"name":"A green door","checked":false,"id":1,"dimensions":{"width":5,"height":10},"tags":["home","green"]}