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