最近项目中用到了fastjson(1.2.15)需要将前端多层嵌套json转换为map,由于map的无序性,想了很多办法,最终找到使用 Map m= JSONArray.parseObject(json, LinkedHashMap<String,String>.class); 来转换,问题来了,第一层顺序是对的,但是第二层排序居然出问题了,目前仅仅只是需要转换成String 他居然把String都给自动排序了,后来网上查了很多资料发现还可以采用一种方式:
- JSONObject jsonObj = new JSONObject(true);
- Map m= jsonObj.parseObject(json, LinkedHashMap.class);
JSONObject jsonObj = new JSONObject(true);
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行发现
- else if (ch == '{') { // 减少嵌套,兼容android
- lexer.nextToken();
- final boolean parentIsArray = fieldName != null && fieldName.getClass() == Integer.class;
- <span style="color: #ff0000;"><strong>JSONObject input = new JSONObject(lexer.isEnabled(Feature.OrderedField)</strong></span>);
else if (ch == '{') { // 减少嵌套,兼容android
lexer.nextToken();final boolean parentIsArray = fieldName != null && fieldName.getClass() == Integer.class; <span style="color: #ff0000;"><strong>JSONObject input = new JSONObject(lexer.isEnabled(Feature.OrderedField)</strong></span>);
</pre>居然这里面判断了Feature.OrderedField
果断知道了解决办法:
HashMap m= JSON.parseObject(json,LinkedHashMap.class,Feature.OrderedField);
搞定,输出结果:
{t1=, t3=, t2={"a1":"","a3":"","a2":""}}
功夫不负有心人.........
5
顶
顶
0
踩
踩
分享到:
- 2016-07-20 23:43
- 浏览 10501
- 评论(3)
<li>分类:<a href="https://www.iteye.com/blogs/category/opensource">开源软件</a></li>
<li class="last"><a href="https://www.iteye.com/wiki/blog/2312512" target="_blank" class="more">查看更多</a></li>
</ul>
评论
666 xiexie ~
注册账号发句感谢
非常棒!完美解决了我在使用fastjson遇到的问题。感谢~!