给出两个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));
有什么方便的方法可以正确比较它们?
答案 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。