zoukankan      html  css  js  c++  java
  • fastjson排序 Map多层嵌套转换自动排序问题终极解决方案

           最近项目中用到了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);

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

    传入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;
    
                        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":""}}

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

  • 相关阅读:
    开源权限框架shiro 入门
    Struts1.2入门笔记
    memcache概述
    教你如何将中文转换成全拼
    WPF第一章(XAML前台标记语言(Chapter02代码讲解))
    WPF第一章(XAML前台标记语言)
    WPF简介
    Activity以singleTask模式启动,intent传值的解决办法
    linux下查看文件编码以及编码转换
    Fedora 17字体美化
  • 原文地址:https://www.cnblogs.com/hiaming/p/8967829.html
Copyright © 2011-2022 走看看