fastjson排序 Map多层嵌套转换自动排序问题终极解决方案

时间:2021-10-15 00:52:26
阅读更多

       最近项目中用到了fastjson(1.2.15)需要将前端多层嵌套json转换为map,由于map的无序性,想了很多办法,最终找到使用 Map m= JSONArray.parseObject(json, LinkedHashMap<String,String>.class); 来转换,问题来了,第一层顺序是对的,但是第二层排序居然出问题了,目前仅仅只是需要转换成String 他居然把String都给自动排序了,后来网上查了很多资料发现还可以采用一种方式:

Java代码   fastjson排序 Map多层嵌套转换自动排序问题终极解决方案fastjson排序 Map多层嵌套转换自动排序问题终极解决方案
  1. JSONObject jsonObj = new JSONObject(true);  
  2. Map m= jsonObj.parseObject(json, LinkedHashMap.class);  

 但是输出问题还是存在第二层以后排序混乱,如下:

传入Json:
{"t1":"","t3":"","t2":{"a1":"","a3":"","a2":""}}

 

输出:

{t1=, t3=, t2={"a1":"","a2":"","a3":""}}

 

无奈,跟踪fastjson源码,花了2小时在com.alibaba.fastjson.parser.DefaultJSONParser 类中475行发现

Java代码   fastjson排序 Map多层嵌套转换自动排序问题终极解决方案fastjson排序 Map多层嵌套转换自动排序问题终极解决方案
  1. else if (ch == '{') { // 减少嵌套,兼容android  
  2.                    lexer.nextToken();  
  3.   
  4.                    final boolean parentIsArray = fieldName != null && fieldName.getClass() == Integer.class;  
  5.   
  6.                    <span style="color: #ff0000;"><strong>JSONObject input = new JSONObject(lexer.isEnabled(Feature.OrderedField)</strong></span>);  
  7.                     

 居然这里面判断了Feature.OrderedField

果断知道了解决办法:

HashMap m=  JSON.parseObject(json,LinkedHashMap.class,Feature.OrderedField);

搞定,输出结果:

{t1=, t3=, t2={"a1":"","a3":"","a2":""}}

 

功夫不负有心人.........

5
0
分享到: fastjson排序 Map多层嵌套转换自动排序问题终极解决方案 fastjson排序 Map多层嵌套转换自动排序问题终极解决方案
评论
3 楼 youngcoder 2017-12-05  
666   xiexie ~
2 楼 FutaoSmile丶 2017-12-04  
注册账号发句感谢fastjson排序 Map多层嵌套转换自动排序问题终极解决方案
1 楼 ipuhua 2016-09-27  
非常棒!完美解决了我在使用fastjson遇到的问题。感谢~!