signed

QiShunwang

“诚信为本、客户至上”

fastjson转换对象为json字符串时,对象内Map元素乱序问题

2021/4/26 18:34:43   来源:

经常会使用fastjson的JSON.parseObject(); 将java对象序列化和反序列化。

如果代码中使用到了JSON.parseObject();这个方法反序列化了controller返回的对象,那么返回给前端的数据有一定概率会导致对象内Map对象元素或者List对象元素顺序乱序。


举个栗子:

@GetMapping(path = "/testJsonOrder")
public Result<Map<String, Object>> testJsonOrder() {
    Result<Map<String, Object>> result = Result.createSuccessResult();
    Map<String, Object> fieldMap = Maps.newLinkedHashMap();
    fieldMap.put("key1", "value1");
    fieldMap.put("key4", "value4");
    fieldMap.put("key2", "value2");
    fieldMap.put("key3", "value3");
    fieldMap.put("key5", "value5");
    Map<String, Object> res = new HashMap<>();
    res.put("fieldMap", fieldMap);
    result.value(res);
    String s = JSON.toJSONString(result);
    Result result1 = JSON.parseObject(s, Result.class);
    return result1;
}

debug调试截图:
在这里插入图片描述
可以发现。反序列化后fieldMap元素乱序了。


如果发现乱序问题,可以用下面思路解决:
1、JSON.parseObject();方法传递Feature参数,比如:

Result result1 = JSON.parseObject(s, Result.class, Feature.OrderedField);

可以发现,顺序不乱了。
在这里插入图片描述
2、也可使用SpringBoot内置的jackson ObjectMapper 进行序列化和反序列化操作。


建议:由于alibaba.fastjson没人维护以及各种漏洞问题,不建议使用。建议直接使用内置 jackson ObjectMapper。