目录

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,略

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐