目录

1.JSONObject 存在的默认排序问题一

1.1. 解决方案一

1.2. 解决方案二

2.JSONObject 存在的默认排序问题二

2.1. 解决方案一

2.2. 解决方案二


在使用 fastjson 中的 JSONObject 有时候会遇到数据顺序发生了变化,而实际需求中需要保持原有的顺序。

1.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}

2.JSONObject 存在的默认排序问题二

在使用 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,略