map结构默认根据key排序
问题描述
map结构默认根据key排序
版本信息
[e.g.:Fastjson2 2.0.21]
Map<String,String> map = new HashMap<>(); map.put("2","2"); map.put("1","1"); System.out.println(JSON.toJSONString(map));
实际输出结果
{"1":"1","2":"2"}
期待的正确结果
{"2":"2","1":"1"}
原提问者GitHub用户HuShao96
和fastjson 1.x一样,加上 Feature.MapSortField就是你期待的结果,如下:
Map<String,String> map = new HashMap<>();
map.put("2","2");
map.put("1","1");
assertEquals(
"{\"1\":\"1\",\"2\":\"2\"}",
JSON.toJSONString(map, JSONWriter.Feature.MapSortField)
);
原回答者GitHub用户wenshao
在 Fastjson 2.x 中,默认情况下,Map 类型对象的输出顺序是根据 key 的自然排序(即按照 key 值的字典序排序)来决定的。因此,如果要保证 Map 输出顺序的稳定性,可以使用 TreeMap 对象或者 LinkedHashMap 对象来代替 HashMap 对象。这两个类可以通过传入 Comparator 对象或者插入顺序来决定输出顺序。
如果想要使用 HashMap 对象并且保证输出顺序固定,可以使用 SerializerFeature.MapSortField 特性来控制输出顺序。例如:
Map<String,String> map = new HashMap<>(); map.put("2","2"); map.put("1","1"); System.out.println(JSON.toJSONString(map, SerializerFeature.MapSortField)); 在上面的代码中,我们使用了 SerializerFeature.MapSortField 特性来控制输出顺序。输出结果为:
{"1":"1","2":"2"} 需要注意的是,使用 SerializerFeature.MapSortField 特性可能会影响序列化的性能,因此建议在必要时使用。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。