你认为应该如何处理这个任务?
我看到的挑战在于如何智能地呈现不同的信息。在我重新发明轮子之前,是否有一种通用方法来处理这样的比较?
你认为应该如何处理这个任务?
我看到的挑战在于如何智能地呈现不同的信息。在我重新发明轮子之前,是否有一种通用方法来处理这样的比较?
import com.fasterxml.jackson.databind.{ObjectMapper, JsonNode}
JsonNode beforeNode = jacksonObjectMapper.readTree(beforeJsonString);
JsonNode afterNode = jacksonObjectMapper.readTree(afterJsonString);
import com.flipkart.zjsonpatch.JsonDiff
JsonNode patch = JsonDiff.asJson(beforeNode, afterNode);
String diffs = patch.toString();
ObjectMapper
:ObjectMapper mapper = new ObjectMapper();
JsonNode beforeNode = mapper.readTree(beforeJsonString);
JsonNode afterNode = mapper.readTree(afterJsonString);
JsonNode patch = JsonDiff.asJson(beforeNode, afterNode);
String diffs = patch.toString();
- kohane15我用过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);
}
...
使用JSONAssert库中的JSONCompare
是比较JSON字符串最简单的方式。优点是,它不仅限于结构,如果需要还可以比较值:
JSONCompareResult result =
JSONCompare.compareJSON(json1, json2, JSONCompareMode.STRICT);
System.out.println(result.toString());
将输出像这样的内容:
Expected: VALUE1
got: VALUE2
; field1.field2
ObjectMapper mapper = new ObjectMapper();
JsonNode tree1 = mapper.readTree(jsonInput1);
JsonNode tree2 = mapper.readTree(jsonInput2);
boolean areTheyEqual = tree1.equals(tree2);
从 JsonNode.equals 的JavaDoc文档 中得知:
节点对象的相等性被定义为完全(深层)值的相等。这意味着可以通过比较根节点的相等性来比较完整的JSON树是否相等。
mapper.readTree
将无法正常工作。 - Cherry您可以尝试使用XStream的架构和JSON映射处理。
此外,请查看此帖子:在C#中比较两个XML文件并生成第三个文件,使用XMLDiff进行比较。虽然是C#,但逻辑相同。
original
{
a: { b: 42 }
}
patch
{
"~a": { c: 43 }
}
~
表示对象合并。
result
{
a: { b: 42, c: 43 }
}
<dependency>
<groupId>org.skyscreamer</groupId>
<artifactId>jsonassert</artifactId>
<version>1.5.0</version>
<scope>test</scope>
</dependency>
public static boolean isTwoJsonEquals(JSONObject firstObj,JSONObject secondObj, JSONCompareMode compareMode){
try {
JSONCompareResult result = JSONCompare.compareJSON(firstObj, secondObj, compareMode);
return result.passed();
} catch (JSONException e) {
e.printStackTrace();
}
return false;
}
对于已经使用Jackson的人,我建议使用json-patch。
final JsonNode patchNode = JsonDiff.asJson(firstNode, secondNode);
System.out.println("Diff=" + m.writeValueAsString(patchNode));
我会使用json-lib解析JSON数据。这将生成普通的Java对象,你可以使用equals方法进行比较。不过,这只适用于假设 json-lib 的开发人员正确实现了equals方法,不过你可以轻松进行测试。
使用Google的Guava库进行比较。请查看这个答案,其中详细解释了如何使用它。