java-以相同的顺序比较两个具有相同键的json对象

时间:2019-03-28 02:25:10

标签: java

给出两个json对象

String a1 = "{\"a\":[{\"b\":\"1\"}, {\"b\":\"2\"}]}";
String a2 = "{\"a\":[{\"b\":\"2\"}, {\"b\":\"1\"}]}";

我想比较它们,而不管对象在数组中的顺序如何。我正在使用Jackson,但是它不起作用。

ObjectMapper om = new ObjectMapper().configure(
    SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true
);
Map<String, Object> m1 = (Map<String, Object>)(om.readValue(a1, Map.class));
Map<String, Object> m2 = (Map<String, Object>)(om.readValue(a2, Map.class));
System.out.println(m1.equals(m2));

有什么方便的方法可以正确比较它们?

1 个答案:

答案 0 :(得分:0)

您的om.readValue()呼叫返回一个Map<String, List<Map<String, Integer>>>

Map<String, List<Map<String, Integer>>> m1 = om.readValue(a1, Map.class);
Map<String, List<Map<String, Integer>>> m2 = om.readValue(a2, Map.class);

System.out.println(m1); //{a=[{b=1}, {b=2}]}
System.out.println(m2); //{a=[{b=2}, {b=1}]}

列表{b=1}, {b=2}{b=2}, {b=1}的顺序不相等。 因此,我将列表转换为HashSet,然后进行了比较:

Map<String, HashSet<Map<String, Integer>>> m1Collected = m1.entrySet().stream()
        .map(e -> Map.entry(e.getKey(), new HashSet<>(e.getValue())))
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

Map<String, HashSet<Map<String, Integer>>> m2Collected = m2.entrySet().stream()
        .map(e -> Map.entry(e.getKey(), new HashSet<>(e.getValue())))
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

System.out.println(m1Collected.equals(m2Collected)); //prints true

您还可以使用严格模式设置为false的JSONassert来比较忽略顺序的JSON。