打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
JAVA - fastjson 中 JSONObject 的顺序问题
userphoto

2023.06.02 湖南

关注

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

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
json从立地到成佛
JSON以及Java转换JSON的方法
用jackson包实现json、对象、Map之间的转换
Json应用案例
java解析json数据 - Java / Web 开发
天气预报-java代码
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服