返回顶部
首页 > 资讯 > 后端开发 > JAVA >JAVA - fastjson 中 JSONObject 的顺序问题
  • 303
分享到

JAVA - fastjson 中 JSONObject 的顺序问题

java开发语言数据结构 2023-09-11 07:09:35 303人浏览 八月长安
摘要

目录 1. JSONObject  存在的默认排序问题一 1.1. 解决方案一 1.2. 解决方案二 2. JSONObject  存在的默认排序问题二 2.1. 解决方案一 2.2. 解决方案二 在使用 fastJSON 中的 jsON

目录

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

来源地址:https://blog.csdn.net/u014147522/article/details/128496779

--结束END--

本文标题: JAVA - fastjson 中 JSONObject 的顺序问题

本文链接: https://www.lsjlt.com/news/402858.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作