gson Guava散列表比较

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

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

//Create maps from the given jsons
Gson gson = new Gson();
Type type = new TypeToken<Map<String, Object>>(){}.getType();

Map<String, Object> map1 = gson.fromJson(jsonObject1, type);
Map<String, Object> map2 = gson.fromJson(jsonObject2, type);

//Flatten the maps
Map<String, Object> leftFlatMap = FlatMap.flatten(map1);
Map<String, Object> rightFlatMap = FlatMap.flatten(map2);

//Check differences between both maps
MapDifference<String, Object> difference = Maps.difference(leftFlatMap, rightFlatMap);

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

{    "body":[
      {
         "primitive":"VALUE",
         "jsonArray":[
            {
               "element":83284180
            },
            {
               "anotherElement":20832841804
            }
         ]
      }    
    ] 
 }

第二个JSON:

{
   "body":[
      {
         "primitive":"VALUE",
         "jsonArray":[
            {  
               "anotherElement":20832841804
            },
            {
               "element":83284180
            }  
         ]
      }
   ]
}

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

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

hfwmuf9z

hfwmuf9z1#

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

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

相关问题