在Java中比较2个JSON文件的最佳方法

Jam*_*sev 19 java comparison json

您如何建议接近这项任务?

我所看到的挑战是智能地呈现差异信息.在我重新发明轮子之前,是否有一种可接受的方法来处理这种比较?

pac*_*low 19

我推荐使用zjsonpatch库,它根据RFC 6902(JSON Patch)提供diff信息.你可以和Jackson一起使用它:

JsonNode beforeNode = jacksonObjectMapper.readTree(beforeJsonString);
JsonNode afterNode = jacksonObjectMapper.readTree(afterJsonString);
JsonNode patch = JsonDiff.asJson(beforeNode, afterNode);
String diffs = patch.toString();
Run Code Online (Sandbox Code Playgroud)

这个库比fge-json-patch(在另一个答案中提到的)更好,因为它可以检测从数组中插入/删除的项目.Fge-json-patch无法处理(如果一个项目被插入到数组的中间,它会认为该项目和之后的每个项目都被更改,因为它们都被移动了一个).

  • 它比较键和值。如何使其仅用于密钥? (2认同)

Cen*_*giz 9

我已经用JSONAssert做了很好的经验.

import org.junit.Test;
import org.apache.commons.io.FileUtils;
import org.skyscreamer.jsonassert.JSONAssert;
import org.skyscreamer.jsonassert.JSONCompareMode;

... 
@Test
public void myTest() {
  String expectedJson = FileUtils.readFileToString("/expectedFile");
  String actualJson = FileUtils.readFileToString("/actualFile");
  JSONAssert.assertEquals(expectedJson, actualJson, JSONCompareMode.STRICT);
}
... 
Run Code Online (Sandbox Code Playgroud)


Pro*_*uce 7

这只涉及平等,而不是差异.


与杰克逊.

ObjectMapper mapper = new ObjectMapper();

JsonNode tree1 = mapper.readTree(jsonInput1);
JsonNode tree2 = mapper.readTree(jsonInput2);

boolean areTheyEqual = tree1.equals(tree2);
Run Code Online (Sandbox Code Playgroud)

JavaDoc for JsonNode.equals:

节点对象的等同性被定义为完全(深)值相等.这意味着可以通过比较根节点的相等性来比较完整的JSON树是否相等.

  • 如果json字段的顺序不同,`mapper.readTree`不起作用. (6认同)
  • 并且只比较json文档的结构。 (2认同)
  • @Cherry json 字段 _can_ 有不同的顺序。但是两个*列表元素*只有在它们具有完全相同的顺序的相同值时才会被比较为相等。 (2认同)

JF *_*ieu 5

您可以尝试XStream 的架构,处理 JSON 映射

另外,请查看这篇文章:Comparing Two XML files &generate a Third with XMLDiff in C#。虽然是 C# 语言,但逻辑是一样的。


Ean*_*n V 5

比较JSON字符串的最简单的方法是使用JSONCompareJSONAssert库。好处是,它不仅限于结构,还可以根据需要比较值:

JSONCompareResult result = 
     JSONCompare.compareJSON(json1, json2, JSONCompareMode.STRICT);
System.out.println(result.toString());
Run Code Online (Sandbox Code Playgroud)

这将输出类似:

Expected: VALUE1
     got: VALUE2
 ; field1.field2
Run Code Online (Sandbox Code Playgroud)