Fastjson 序列化,反序列化Map对象排序问题(字符串转map,map转字符串)

    xiaoxiao2021-03-25  91

    背景

    记录项目中遇到的 关于fastjson jsonobject转string乱序,string转jsonObject乱序问题的解决方案

    fastJson issues

    问题来源描述参见: https://github.com/alibaba/fastjson/issues/359 https://github.com/alibaba/fastjson/issues/954 【最终解答】

    单嵌套的Map序列化与反序列问题

    JSONObject map=new JSONObject(true);//关键要设置为true,否则乱序 map.put("请假类型","1"); map.put("单据状态","2"); map.put("开始时间","3"); map.put("结束时间","4"); map.put("请假原因","5"); OkhttpUtils.println(map.toString());//封装的打印语句,不用理会 OkhttpUtils.println(map.toString()); //这条直接转的方案,会产生乱序问题!!! //JSONObject root=JSON.parseObject(map.toString()); LinkedHashMap<String, Object> root=JSON.parseObject(map.toString(),new TypeReference<LinkedHashMap<String, Object>>(){} );//关键的地方,转化为有序map OkhttpUtils.println(JSON.toJSONString(root)); //有了map对象,你就可以顺序打印,至于转不转JSONObject对象,看需求在定 // JSONObject json=new JSONObject(true); // json.putAll(root);//存放map对象 Collection<Object> lists=root.values(); // Collection<Object> lists=json.values();//这种new JSONObject方案也可以 //打印 for (Object object : lists) { OkhttpUtils.println(object.toString()); }

    程序打印:

    【第45行】:{"请假类型":"1","单据状态":"2","开始时间":"3","结束时间":"4","请假原因":"5"} 【第48行】:{"请假类型":"1","单据状态":"2","开始时间":"3","结束时间":"4","请假原因":"5"} 【第51行】:{"请假类型":"1","单据状态":"2","开始时间":"3","结束时间":"4","请假原因":"5"}

    上述代码见实例程序:

    https://github.com/Arisono/Gradle-demo/blob/master/src/main/java/com/gradle/java/utils/FastJsonUtil.java

    组合的map json串,嵌套的map json串问题

    类似这种形式:

    {"Format":"json","Name":"wwqqzz","Para":{"myuser":333,"mynum":"222", "mylist":[11,55,"33"]},"Reserved":{},"Type":"request","Version":"1.0"}

    Feature.OrderedField 解决嵌套多层map 的时候序列排序问题

    LinkedHashMap<String, Object> rootStr=JSON.parseObject(mapStr.toString(),new TypeReference<LinkedHashMap<String, Object>>(){} ,Feature.OrderedField);

    联系方式:

    github:https://github.com/ArisonoQQ群:151909524

    参考文献:

    fastjson排序 Map多层嵌套转换自动排序问题终极解决方案
    转载请注明原文地址: https://ju.6miu.com/read-19675.html

    最新回复(0)