比如把这窜json窜{"cardlist":[{"bankcode":"SPDB","bindid":"88325987","bindvalidthru":2145888000,"card_last":"9990","card_name":"浦发银行储蓄卡","card_top":"621792","cardtype":1,"merchantaccount":"123","phone":"**"}],"identityid":"123123","identitytype":2,"merchantaccount":"123321","sign":"123211"} ,经过TreeMap<String, Object> map = JSON.parseObject(realData,new TypeReference<TreeMap<String, Object>>() {});转成treemap后.最大层的那些key的顺序是按自然顺序升序排列的.但是这个cardlist下面的值变成了乱序{cardlist=[{"card_top":"621792","card_last":"9990","phone":"**","card_name":"浦发银行储蓄卡","bindvalidthru":2145888000,"cardtype":1,"merchantaccount":"123","bankcode":"SPDB","bindid":"88325987"}], identityid=123123, identitytype=2, merchantaccount=123321, sign=123131},实际应该按照原窜的顺序进行排列.这个问题在1.1.8的包里面转成treemap是正常的,换到1.2.29以上版本后就不行了
[alibaba/fastjson]转成treemap时,value嵌套的map对象会变成乱序
回答
bean是无序的
可是1.1.8的版本就是按照升序排序的.新版本里面做法不再是一样的了吗?有没有别的办法,不在自己手动遍历的情况下,做到嵌套的也是按treemap那样自然排序的?
JSON.toJSONStrinng(obj, SerializerFeature.MapSortField); // since 1.2.27
感谢各位大神回答,但是我试了下,针对我上面那个map里面嵌套list的例子,还是不行,没能做到嵌套的list的key按照treemap的自然顺序排序
这是我的代码System.out.println("1:" + responseDataMap); String str = JSONObject.toJSONString(responseDataMap, SerializerFeature.MapSortField); System.out.println("2:" + str); responseDataMap = JSON.parseObject(str,new TypeReference<TreeMap<String, String>>() {});打印结果为1:{cardlist=[{"merchantaccount":"123456789","cardtype":2,"card_last":"0564","phone":"123","card_top":"625976","bankcode":"CEB","bindvalidthru":2145888000,"card_name":"光大银行信用卡","bindid":"88772981"},{"merchantaccount":"123456789","cardtype":1,"card_last":"9990","phone":"123","card_top":"621792","bankcode":"SPDB","bindvalidthru":2145888000,"card_name":"浦发银行储蓄卡","bindid":"89971803"}], identityid=10002223, identitytype=2, merchantaccount=123456789} 2:{"cardlist":"[{\"merchantaccount\":\"123456789\",\"cardtype\":2,\"card_last\":\"0564\",\"phone\":\"123\",\"card_top\":\"625976\",\"bankcode\":\"CEB\",\"bindvalidthru\":2145888000,\"card_name\":\"光大银行信用卡\",\"bindid\":\"88772981\"},{\"merchantaccount\":\"123456789\",\"cardtype\":1,\"card_last\":\"9990\",\"phone\":\"123\",\"card_top\":\"621792\",\"bankcode\":\"SPDB\",\"bindvalidthru\":2145888000,\"card_name\":\"浦发银行储蓄卡\",\"bindid\":\"89971803\"}]","identityid":"10002223","identitytype":"2","merchantaccount":"123456789"}
其中,第一个打印的responseDataMap,就是一个map中某个key嵌套了一个list的.而正是这个list,没有能够按照key的升序排列,使用 @wenshao 的方法把map转成string的时候也没能把嵌套的值给排序.然后再转回treemap的时候一样,不行.而1.1.8的版本时候,只要JSON.parseObject(str,new TypeReference<TreeMap<String, String>>()这一步,就可以做到包括嵌套的值也排序了.新版本没有这样的设计,是考虑到性能问题吗?我用的新版是1.2.29版本
同样的数据,以下是用1.1.8版本跑这段代码JSON.parseObject(str,new TypeReference<TreeMap<String, String>>()的结果{cardlist=[{"bankcode":"CEB","bindid":"88772981","bindvalidthru":2145888000,"card_last":"0564","card_name":"光大银行信用卡","card_top":"625976","cardtype":2,"merchantaccount":"123456789","phone":"123"},{"bankcode":"SPDB","bindid":"89971803","bindvalidthru":2145888000,"card_last":"9990","card_name":"浦发银行储蓄卡","card_top":"621792","cardtype":1,"merchantaccount":"123456789","phone":"123"}],identityid=10002223, identitytype=2, merchantaccount=123456789}
如果想按照原串的顺序转为Map可以用 JSON.parseObject(jsonStr, new TypeReference<Map<String, Object>>(){}, Feature.OrderedField); , 1.2.29版本支持该操作