分享

JAVA - fastjson 中 JSONObject 的顺序问题

 hncdman 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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多