目录
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,略