前段时间需要用java开发一个公司系统服务的SDK,其中碰到了一个很恶心的问题,在此小记。
需求
我需要将一个对象转成成json字符串,并要求每个字段都是按照字段名升序排序。
已知
fastjson将对象转换成json的时候会将object A 的字段按照名称升序排序。
问题
object A中有个属性是一个对象 B,这个内置对象 B有一个属性是HashMap类型。
1. 我将这个A的json字符串装成object,得到object A
2. 填充object中的部分字段;
3. 将object A转成有序json
至此,问题出现:b对象中的hashMap的顺序为json串中的排列顺序。
一般来说,hashMap会对键值的排序是按照key的哈希值进行排序的。这里本人存在一个误区:认为键值的哈希值的大小顺序和键值的大小顺序是一样的。其实哈希值是的大小无法通过被哈希的值的大小来估计。
解决方法
将hashMap换成TreeMap,并实现自己的Comparator来对键值进行升序排序