JAVA - fastjson 中 JSONObject 的顺序问题
Posted Encarta1993
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA - fastjson 中 JSONObject 的顺序问题相关的知识,希望对你有一定的参考价值。
目录
在使用 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,略
fastjson中Map与JSONObject互换
1、//将map转换成jsonObject
JSONObject itemJSONObj = JSONObject.parseObject(JSON.toJSONString(itemMap));
将Map类型的itemInfo转换成json,再经JSONObject转换实现。
2、//将jsonObj转换成Map
Map<String, Object> itemMap = JSONObject.toJavaObject(itemJSONObj, Map.class);
//JOSN.parseObjet()方法同样可以转换
以上是关于JAVA - fastjson 中 JSONObject 的顺序问题的主要内容,如果未能解决你的问题,请参考以下文章