有人可以建议使用一些Java库或代码来获取两个JSON字符串的差异吗?
答案 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根据您的具体标准。