alibaba / fastjson

FASTJSON 2.0.x has been released, faster and more secure, recommend you upgrade.
https://github.com/alibaba/fastjson2/wiki/fastjson_1_upgrade_cn
Apache License 2.0
25.72k stars 6.5k forks source link

JSONObject里面的map序列换问题 #3416

Open spirite9527 opened 4 years ago

spirite9527 commented 4 years ago

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

ichenhe commented 4 years ago

对于 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"
    }
]
spirite9527 commented 4 years ago

jsonobject内部就是个Map啊,而且是可以指定为HashMap还是linkedhashMap,现在问题是我指定了为linkedhashMap,RPC之后却序列化成了hashMap。 这种要求应该是合理的吧

ichenhe commented 4 years ago

照这么说确实存在问题,看看有没有合作者查一下,我不太了解 RPC 过程中的行为。

不过我个人还是感觉这种用例不太规范。如果后期换了一个 json 库就不一定能保持顺序一致。

CalebZYC commented 4 years ago

如果使用的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