Encarta1993 已于 2022-12-30 16:14:14 修改 2864 收藏 3 分类专栏: Java 文章标签: java 开发语言 数据结构 版权 Java 专栏收录该内容 13 篇文章0 订阅 订阅专栏 目录 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,略 ———————————————— 版权声明:本文为CSDN博主「Encarta1993」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/u014147522/article/details/128496779 |
|