经常会使用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。