文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

JAVA - fastjson 中 JSONObject 的顺序问题

2023-09-11 07:52

关注

目录

1. JSONObject  存在的默认排序问题一

1.1. 解决方案一

1.2. 解决方案二

2. JSONObject  存在的默认排序问题二

2.1. 解决方案一

2.2. 解决方案二


在使用 fastjson 中的 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}

在使用 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

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯