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

时间:2010-07-09 15:29:47

标签: java json

有人可以建议使用一些Java库或代码来获取两个JSON字符串的差异吗?

5 个答案:

答案 0 :(得分:12)

我遇到了完全相同的问题并最终编写了自己的库:

https://github.com/algesten/jsondiff

它同时进行差异/修补。

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

示例:

original
{
   a: { b: 42 }
}

patch
{
  "~a" { c: 43 }
}

~表示对象合并。

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

答案 1 :(得分:11)

对于一个特定的建议,您可以使用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数组,对象和原始值的预期工作。

答案 2 :(得分:3)

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

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

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:0)

接受的答案很好,工作出色。

不过,对于维护性更好的库,我建议使用 https://github.com/java-json-tools/json-patch,我只是用它来解决 JSON 掩码(如果您好奇,请参阅 Apply a mask on a JSON to keep only mandatory data)。

<块引用>

注意:在 ObjectMapper 库中使用您自己的 json-patch 使其更加实用,因为它避免了使用您自定义的 ObjectMapper 进行读取和重写以获得有效的 JSON根据您的具体标准。