[alibaba/fastjson]JSONObject里面的map序列换问题

2024-10-16 667 views
5

在开发中遇到个问题,在两个服务中的jsonobject的传递会把jsonobject里面的map序列化成hashmap 例:A服务 new jsonobject(true);然后put一些值,通过参数把jsonobject传递给B服务,B服务接收到的jsonobject里面的map就变成了hashmap,并不是A服务指定的linkedHashMap。 有什么办法让B服务是我想要的指定的顺序吗

回答

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序列化协议,JSONObjectfastjson内部的,rpc的服务提供方需要将序列化协议配置成fastjson,并且增加配置:

 static {
     JSON.DEFAULT_PARSER_FEATURE |= Feature.config(JSON.DEFAULT_PARSER_FEATURE, Feature.OrderedField, true);
  }

image

image

那个序列化操作会将元数据的json字符串重新put到map,通过ordered判断是linked还是hash的map