Java中JSON格式反序列化为Map且保证存取顺序一致的问题
作者:紫冰芊
这篇文章主要介绍了Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
背景
做项目涉及两个微服务之间传数据时,需要提供方将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);
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。