目录
在使用 fastjson 中的 JSONObject 有时候会遇到数据顺序发生了变化,而实际需求中需要保持原有的顺序。
JSONObject 初始化时候顺序直接变了
package com;import com.alibaba.fastjson.JSONObject;import java.util.LinkedHashMap;import java.util.Map;public class TestFastjson { public static void main(String[] args) { Map map = new LinkedHashMap<>(); map.put("c", 1); map.put("a", 2); map.put("b", 3); System.out.println("LinkedHashMap: " + map); JSONObject jsonObject = new JSONObject(); jsonObject.putAll(map); System.out.println("JSONObject: " + jsonObject); }}
代码执行结果为:
LinkedHashMap: {c=1, a=2, b=3}JSONObject: {"a":2,"b":3,"c":1}
可以看出 JSONObject 的顺序并没有保持原来的 LinkedHashMap 的顺序。原因可看源码发现:
JSONObject 初始化的时候调用的是 HashMap,导致不能保持原有的顺序,新的排序结果由 key 决定。
如果需要保持原有的顺序,从此源码中可看出两种解决方案。
1.1. 解决方案一
可以使用 ordered 参数来使用 LinkedHashMap 来初始化 JSONObject。
package com;import com.alibaba.fastjson.JSONObject;import java.util.LinkedHashMap;import java.util.Map;public class TestFastjson { public static void main(String[] args) { Map map = new LinkedHashMap<>(); map.put("c", 1); map.put("a", 2); map.put("b", 3); System.out.println("LinkedHashMap: " + map); JSONObject jsonObject = new JSONObject(true); jsonObject.putAll(map); System.out.println("JSONObject: " + jsonObject); }}
执行结果
LinkedHashMap: {c=1, a=2, b=3}JSONObject: {"c":1,"a":2,"b":3}
1.2. 解决方案二
直接使用 LinkedHashMap 来初始化 JSONObject。
package com;import com.alibaba.fastjson.JSONObject;import java.util.LinkedHashMap;import java.util.Map;public class TestFastjson { public static void main(String[] args) { Map map = new LinkedHashMap<>(); map.put("c", 1); map.put("a", 2); map.put("b", 3); System.out.println("LinkedHashMap: " + map); JSONObject jsonObject = new JSONObject(new LinkedHashMap<>()); jsonObject.putAll(map); System.out.println("JSONObject: " + jsonObject); }}
执行结果
LinkedHashMap: {c=1, a=2, b=3}JSONObject: {"c":1,"a":2,"b":3}
在使用 JSONObject.parseObject 的时候 JSONObject 顺序变了
package com;import com.alibaba.fastjson.JSONObject;import java.util.LinkedHashMap;import java.util.Map;public class TestFastjson { public static void main(String[] args) { Map map = new LinkedHashMap<>(); map.put("c", 1); map.put("a", 2); map.put("b", 3); System.out.println("LinkedHashMap: " + map); JSONObject jsonObject = new JSONObject(true); jsonObject.putAll(map); System.out.println("JSONObject: " + jsonObject); JSONObject jsonObject1 = JSONObject.parseObject(JSONObject.toJSONString(jsonObject)); System.out.println("JSONObject1: " + jsonObject1); }}
执行结果
LinkedHashMap: {c=1, a=2, b=3}JSONObject: {"c":1,"a":2,"b":3}JSONObject1: {"a":2,"b":3,"c":1}
JSONObject 转成 String 再转回 JSONObject 出现了问题一中的情况,原因可知也是相同的。
2.1. 解决方案一
从源码中可以看到,通过 Feature 可以指定 ParseObject 时候的特征,因此
package com;import com.alibaba.fastjson.JSONObject;import com.alibaba.fastjson.parser.Feature;import java.util.LinkedHashMap;import java.util.Map;public class TestFastjson { public static void main(String[] args) { Map map = new LinkedHashMap<>(); map.put("c", 1); map.put("a", 2); map.put("b", 3); System.out.println("LinkedHashMap: " + map); JSONObject jsonObject = new JSONObject(true); jsonObject.putAll(map); System.out.println("JSONObject: " + jsonObject); JSONObject jsonObject1 = JSONObject.parseObject(JSONObject.toJSONString(jsonObject), Feature.OrderedField); System.out.println("JSONObject1: " + jsonObject1); }}
执行结果
LinkedHashMap: {c=1, a=2, b=3}JSONObject: {"c":1,"a":2,"b":3}JSONObject1: {"c":1,"a":2,"b":3}
2.2. 解决方案二
直接使用 JSONArray,略
来源地址:https://blog.csdn.net/u014147522/article/details/128496779