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无法处理(如果一个项目被插入到数组的中间,它会认为该项目和之后的每个项目都被更改,因为它们都被移动了一个).
我已经用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)
这只涉及平等,而不是差异.
与杰克逊.
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)
节点对象的等同性被定义为完全(深)值相等.这意味着可以通过比较根节点的相等性来比较完整的JSON树是否相等.
比较JSON字符串的最简单的方法是使用JSONCompare从JSONAssert库。好处是,它不仅限于结构,还可以根据需要比较值:
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)
| 归档时间: |
|
| 查看次数: |
58214 次 |
| 最近记录: |