JAVA - fastjson 中 JSONObject 的顺序问题

Posted Encarta1993

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 初始化的时候调用的是 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,略

fastjson中Map与JSONObject互换

1、//将map转换成jsonObject 

JSONObject itemJSONObj = JSONObject.parseObject(JSON.toJSONString(itemMap));

将Map类型的itemInfo转换成json,再经JSONObject转换实现。

2、//将jsonObj转换成Map
Map<String, Object> itemMap = JSONObject.toJavaObject(itemJSONObj, Map.class);

//JOSN.parseObjet()方法同样可以转换

以上是关于JAVA - fastjson 中 JSONObject 的顺序问题的主要内容,如果未能解决你的问题,请参考以下文章

fastjson中Map与JSONObject互换

json和对象list互转

fastjson中怎么把java对象转化为json对象

在 GWT(跨服务器)中调试 JSON

fastJson中常用JSON字符串和Java对象互转

fastjson使用详解