• 背景:做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为com.alibaba.fastjson.JSONObject,再转化为JSONString,传给接收方,接收方将String转换为com.alibaba.fastjson.JSONObject,再反序列化为Map,且接收方需要保持存取顺序一致。

  • 问题:不能将String转为JSONObject,再强转为LinkedMap,这样编译会报错;也不能将String转为JSONArray,再一个一个赋值,组建成LinkedHashMap,还是无序的;也不能在发送方发送对象的toString格式,在接收方将其转换为LinkedHashMap。
  • 解决方法:

     (1)对于仅有一层对象数据内部没有其他对象内部有其他对象但不需要保证内部其他对象的存取顺序一致

  • //发送方这样存数据
    JSONObject map=new JSONObject(true);//关键所在,要设置为true,否则会乱序
    map.put("key1","value1");
    map.put("key2","value2");
    map.put("key3","value3");
    
    //发送方将map.toString()传给接收方
    
    //接收方将从发送方获取的String转化为有序的LinkedHashMap
    LinkedHashMap<String, String> root=JSON.parseObject(map.toString(), new TypeReference<LinkedHashMap<String, String>>(){});//关键所在,转化为有序的
    
    

    (2)对于有多层对象数据,且需要保证内部其他对象的存取顺序一致。

  • //发送方定义多个JSONObject
    JSONObject mapOut = new JSONObject(true);
    for () {
        JSONObject mapIn= new JSONObject(true);
        mapIn.put("key1", "value1");
        mapIn.put("key2", "value2");
        mapOut.put("key3", mapIn);
    }
    
    //发送方将mapOut.toString()发送给接收方
    
    //接收方将String转化为有序的LinkedHashMap且内部结构也有序
    LinkedHashMap<String, Map<String, Object>> map = JSON.parseObject(mapOut.toString(), new TypeReference<LinkedHashMap<String, Map<String, Object>>>(){}, Feature.OrderedField);

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐