gson Guava散列表比较

kb5ga3dv  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(240)

我在使用Guava的Maps.difference时遇到问题
现在,使用以下代码比较来自两个不同json的两个HashMap:

  1. //Create maps from the given jsons
  2. Gson gson = new Gson();
  3. Type type = new TypeToken<Map<String, Object>>(){}.getType();
  4. Map<String, Object> map1 = gson.fromJson(jsonObject1, type);
  5. Map<String, Object> map2 = gson.fromJson(jsonObject2, type);
  6. //Flatten the maps
  7. Map<String, Object> leftFlatMap = FlatMap.flatten(map1);
  8. Map<String, Object> rightFlatMap = FlatMap.flatten(map2);
  9. //Check differences between both maps
  10. MapDifference<String, Object> difference = Maps.difference(leftFlatMap, rightFlatMap);

一切都运行良好,并且(几乎)正确地比较了所有元素。问题是当HashMap中的一个元素是Map数组时,元素是相同的,但顺序不同。如下所示:
第一个JSON:

  1. { "body":[
  2. {
  3. "primitive":"VALUE",
  4. "jsonArray":[
  5. {
  6. "element":83284180
  7. },
  8. {
  9. "anotherElement":20832841804
  10. }
  11. ]
  12. }
  13. ]
  14. }

第二个JSON:

  1. {
  2. "body":[
  3. {
  4. "primitive":"VALUE",
  5. "jsonArray":[
  6. {
  7. "anotherElement":20832841804
  8. },
  9. {
  10. "element":83284180
  11. }
  12. ]
  13. }
  14. ]
  15. }

正如您所看到的,element和anotherElement的值是相同的,但由于它们在数组中的出现顺序不同,因此差异显示了错误。

有没有可能对数组排序?或者有没有其他的解决方案?
提前感谢!!

hfwmuf9z

hfwmuf9z1#

  • 一个 * 可能的解决方案是对内部子数组进行排序,以便影响反序列化的Map(但是,我认为在这种情况下,使用JSON对象制作Map可能不是一个好主意,因为反序列化的成本和策略不一定代表原始JSON对象)。

假设jsonObject1jsonObject2JsonElement实现,则可以对其后代进行排序。
第一个
如有必要,还可以考虑对后代进行递归排序。
请注意,您 * 可能 * 也有给定JSON文档的Map,但我认为这不是您的情况,但如果是,您可能希望应用@JsonAdapter来应用特殊的排序反序列化器(但我仍然认为这不是一个好主意)。或者,也可以为给定的JsonObject创建一个Map视图,以便它可以生成递归的重新排序视图。

相关问题