JAVA - fastjson 中 JSONObject 的顺序问题

这篇具有很好参考价值的文章主要介绍了JAVA - fastjson 中 JSONObject 的顺序问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

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保证顺序,Java,java,开发语言,数据结构

JSONObject 初始化的时候调用的是 HashMap,导致不能保持原有的顺序,新的排序结果由 key 决定。

如果需要保持原有的顺序,从此源码中可看出两种解决方案。

1.1. 解决方案一

jsonobject保证顺序,Java,java,开发语言,数据结构

可以使用 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. 解决方案二

jsonobject保证顺序,Java,java,开发语言,数据结构

直接使用  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. 解决方案一

jsonobject保证顺序,Java,java,开发语言,数据结构

从源码中可以看到,通过 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,略文章来源地址https://www.toymoban.com/news/detail-790693.html

到了这里,关于JAVA - fastjson 中 JSONObject 的顺序问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JSON转换:实体类和JSONObject互转,List和JSONArray互转(fastjson版)

         //1.java对象转化成String      String s=JSONObject.toJSONString(javaObject.class);       //2. java对象转化成Object         Object str=JSONObject.toJSON(javaObject.class);       //3.String类型转json对象        JSONObject jsonObject= JSONObject.parseObject(str);       //4. String转Object         Obj

    2024年02月14日
    浏览(46)
  • 【Java】JSONarray转JSONobject

    公司开发有用到,但是经常会忘记,做笔记记录一下!         1、将数据包转成JSONarray         2、使用for循环遍历JSONarray【这里使用size()方法】         3、每次循环取到的JSONObject对象         4、再根据对象中的字段类型使用getXxx()取到值  

    2024年02月13日
    浏览(33)
  • [java]JsonObject与JsonArray转换

    备忘一下,首先 这是一个JsonArrayStr,他可以转换为 JsonArray 。 这是一个JsonObjectStr,他可以转换为 JsonObject 。 JsonObject转换为java对象、JsonArray转换为Java对象 JsonObject的value为JsonArray,对应的java类型为List。在案例中,java代码如下(这里用的内部类) 使用fastjson转换jsonStr为java对

    2023年04月21日
    浏览(35)
  • Java 阿里的 JSONObject 如何使用

    阿里巴巴的 JSONObject 是一个 Java 类库,用于处理 JSON 数据。它是 Java JSON 工具包 fastjson 的一部分,是一种比较流行的 JSON 序列化和反序列化库,支持 JSON 字符串和 Java 对象之间的相互转换。 在 Java 中使用阿里 JSONObject,需要完成以下步骤: 引入 fastjson 依赖:在项目的 pom.xm

    2024年02月15日
    浏览(40)
  • ClassCastException: com.alibaba.fastjson.JSONObject cannot be cast to 接口json数据转换异常。

    之前在使用fastjson进行接口传输数据时,碰到接收端数据转换异常问题,难了我好久。 例如:我们需要将json转换成实例集合 通常对JSON对象的转换操作是使用 强转 导致一些朋友对实例对象的操作也是进行强转 如下 这样的话我们在对 list 操作时就会报类似如下错误 所以之后

    2024年02月10日
    浏览(44)
  • Java:JSONObject.toJSONString输出字符串内容处理

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 JSONObject可以将Java对象转换成JSON流输出,进行数据显示或者数据交互的时候很好用。 但是JSONObject.toJSONString输出的字符串往往有以下几个格式问题: 1.Java中的 String 类型输出的时候含有双引号(“”)

    2024年02月03日
    浏览(34)
  • Java8 List<Object> 转成 List<JSONObject>

       Java8 List<Object> 转成 List<Map<String, Object>>

    2024年02月16日
    浏览(38)
  • Java8 Stream流List<JSONObject>通过某一属性进行排序

    List对象 1.首先你需要list.parallelStream().sorted 进行流处理,使用parallelStream可以充分调度多核CPU。 2.使用Comparator.comparing进行排序,reversed()进行倒序排列,thenComparing进行下一个排序。 3.Comparator.comparing()里面的内容,也是就是Object::getter,例如Test::getName 4.最后格式化为需要的格式

    2024年02月12日
    浏览(58)
  • Java-json相关转换,JSONObject与实体类/map互转、List/List<map>和JSONArray互转、获取JSONObject中的key value、字符串String转换等

    博客背景是Java开发。json相关的转换、取值等在日常开发中经常使用,但有时候还是会忘记or遇到些奇奇怪怪的问题。以此记录,提醒自己~不定期更新~ 实体类和JSONObject互转 Map和JSONObject互转 String转JSONObject 实体类转JSON字符串时不过滤NULL空值 获取JSONObject中的key value List和

    2024年02月12日
    浏览(76)
  • Java lamda对List<JSONObject>里多个动态属性字段进行动态的降序或者升序

            最近做到一个需求,需要把业务侧返回的数据(格式为ListJSONObject),然后根据前端传来的排序字段、以及升降序属性来排序并返回给前端。要对ListJSONObject中的多个属性字段进行动态的升序或降序排序,我们可以根据需要使用Comparator.comparing()方法和Comparator.reverseOrd

    2024年02月15日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包