在开发中遇到个问题,在两个服务中的jsonobject的传递会把jsonobject里面的map序列化成hashmap 例:A服务 new jsonobject(true);然后put一些值,通过参数把jsonobject传递给B服务,B服务接收到的jsonobject里面的map就变成了hashmap,并不是A服务指定的linkedHashMap。 有什么办法让B服务是我想要的指定的顺序吗
Q
[alibaba/fastjson]JSONObject里面的map序列换问题
5
A
回答
5
对于 json object 来说,字段是无序的,只有数组是有序的。
所以从 LinkedHashMap
转到 json obj 就已经丢失了顺序,要求 json 保留顺序是不合理的。
如果非要用 json 传递有序 map 可以尝试把 map 转成数组。例如:first: AAA, sec: BBB
-> [{"first": "AAA"}, {"sec": "BBB"}]
不过这样因为 item 的 key 是动态的,可能不方便取出,那么可以转换成这样:
[
{
"key": "first",
"value": "AAA"
},
{
"key":"sec",
"value": "BBB"
}
]
4
jsonobject内部就是个Map啊,而且是可以指定为HashMap还是linkedhashMap,现在问题是我指定了为linkedhashMap,RPC之后却序列化成了hashMap。 这种要求应该是合理的吧
5
照这么说确实存在问题,看看有没有合作者查一下,我不太了解 RPC 过程中的行为。
不过我个人还是感觉这种用例不太规范。如果后期换了一个 json 库就不一定能保持顺序一致。
9
如果使用的rpc框架是dubbo,它的默认是用hessian2
序列化协议,JSONObject
是 fastjson
内部的,rpc的服务提供方需要将序列化协议配置成fastjson
,并且增加配置:
static {
JSON.DEFAULT_PARSER_FEATURE |= Feature.config(JSON.DEFAULT_PARSER_FEATURE, Feature.OrderedField, true);
}
那个序列化操作会将元数据的json字符串重新put到map,通过ordered判断是linked还是hash的map