使用Java代码获取两个JSON字符串的差异

任何人都可以建议一些Java库或代码来获得两个JSON字符串的差异?

我有完全相同的问题,最后写了我自己的库:

https://github.com/algesten/jsondiff

它同时进行差异/修补。

Diffs是JSON对象本身,具有对象合并/替换和数组插入/替换的简单语法。

例:

original { a: { b: 42 } } patch { "~a" { c: 43 } } 

~表示对象合并。

 result { a: { b: 42, c: 43 } } 

对于一个特定的建议,您可以使用Jackson ,将JSON字符串绑定到JSON树中,并将它们进行相等性比较。 就像是:

 ObjectMapper mapper = new ObjectMapper(); JsonNode tree1 = mapper.readTree(jsonString1); JsonNode tree2 = mapper.readTree(jsonString2); if (tree1.equals(tree2)) { // yes, contents are equal -- note, ordering of arrays matters, objects not } else { // not equal } 

等价比较是按值进行的,并且应该按照JSON数组,对象和原始值的预期工作。

就个人而言,我建议将JSON字符串反序列化为对象并比较对象。

这样您就不必担心两个JSON字符串之间的额外空格/格式(两个字符串的格式可能大不相同,仍然代表相同的对象)。

上面的答案只检查Json是否相等。如果你想看看javers库的差异。 使用Jackson将json转换为java对象,然后使用javers比较值对象来获取diff。 这是示例代码。(假设p1,p2是两个java对象)

 Javers j = JaversBuilder.javers().build(); Diff diff = j.compare(p1, p2); if (diff.hasChanges()) { List changes = diff.getChanges(); for (Change change : changes) { if (change instanceof ValueChange) { ValueChange valChange = (ValueChange) change; System.out.println(valChange.getPropertyName() + " -- " + valChange.getLeft() + "--"+valchange.getRight()); } } 

这将为您提供关键值以及预期值和实际值之间的差异。