java map转json 排序_fastjson排序 Map多层嵌套转换自动排序问题终极解决方案

在项目中遇到Fastjson将多层嵌套的Json转换为Map时,发现Map的顺序在第二层及之后出现问题。通过尝试使用`JSONArray.parseObject(json, LinkedHashMap.class)`和`JSONObject.parseObject(json, LinkedHashMap.class)`,都无法确保所有层级的顺序。深入源码发现,关键在于`Feature.OrderedField`。最后,通过`JSON.parseObject(json, LinkedHashMap.class, Feature.OrderedField)`成功解决了所有层级排序的问题。" 133431254,19673537,Android动态库崩溃调试技巧与实战,"['Android开发', '编程实践', '调试技巧', 'C++', '共享库']
摘要由CSDN通过智能技术生成

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

Java代码  icon_star.png

spinner.gifJSONObject jsonObj =newJSONObject(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行发现

Java代码  icon_star.png

spinner.gifelseif(ch =='{') {// 减少嵌套,兼容android

lexer.nextToken();

finalbooleanparentIsArray = fieldName !=null&& fieldName.getClass() == Integer.class;

JSONObject input =newJSONObject(lexer.isEnabled(Feature.OrderedField));else if (ch == '{') { // 减少嵌套,兼容android

lexer.nextToken();

final boolean parentIsArray = fieldName != null && fieldName.getClass() == Integer.class;

JSONObject input = new JSONObject(lexer.isEnabled(Feature.OrderedField));

居然这里面判断了Feature.OrderedField

果断知道了解决办法:

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

搞定,输出结果:

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值