英文:
Get difference of two json strings by ignoring specific field
问题
我正在比较两个 JSON 字符串,并在它们不相同时获取差异。在这里,我希望在比较时忽略掉一些字段。
Jackson 是否提供了这个功能,或者有其他更好的库可用呢?
> Json1:
{
"name": "something",
"id": "1",
"version": "123"
}
> Json2:
{
"name": "nothing",
"id": "1",
"version": "12356"
}
我正在使用下面的代码来查找上述示例 JSON 字符串之间的差异:
ObjectMapper mapper = new ObjectMapper();
JsonNode node1 = mapper.valueToTree(json1);
JsonNode node2 = mapper.valueToTree(json2);
String diff = JsonDiff.asJson(node1, node2).toString();
logger.info("Difference: " + diff);
但我希望在比较上述示例 JSON 时忽略 *version* 字段。
Jackson 能做到这一点吗,还是有其他更好的库可用?
英文:
I am working on comparing two JSON strings and getting the difference if not the same. Here I want to ignore a few fields while comparing.
Will Jackson provide this facility or any other library is better?
> Json1:
{
"name": "something",
"id": "1",
"version": "123"
}
> Json2:
{
"name": "nothing",
"id": "1",
"version": "12356"
}
I am using the below code to find the difference between the above sample json strings
ObjectMapper mapper = new ObjectMapper();
JsonNode node1 = mapper.valueToTree(json1);
JsonNode node2 = mapper.valueToTree(json2);
String diff = JsonDiff.asJson(node1, node2).toString();
logger.info("Difference: " + diff);
But I want to ignore version while comparing the JSON from the above sample JSON.
Can Jackson do this or any other better library available?
答案1
得分: 1
如果您需要现成的实现,可以参考:
https://github.com/java-json-tools/json-patch
否则,如果要求是针对简单嵌套对象,并且您希望在比较过程中忽略属性,您可以实现ObjectMapper并覆盖equals方法。
要从比较中删除文件,您可以执行:
((ObjectNode)node1).remove("version");
((ObjectNode)node2).remove("version");
然后您可以简单地调用您的JsonDiff进行分析。
英文:
If you need off-the-shelf implementation, then you can refer to:
https://github.com/java-json-tools/json-patch
Otherwise, if the requirement is on simple nested objects and you want to ignore properties during comparison you can implement ObjectMapper and override the equals method.
To Remove a file from comparison you can do:
((ObjectNode)node1).remove("version");
((ObjectNode)node2).remove("version");
Then you can simply call your JsonDiff to analyze.
答案2
得分: 1
我成功地通过使用不同的库来实现这一目标:
> 导入
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.flipkart.zjsonpatch.JsonDiff;
import com.jayway.jsonpath.DocumentContext;
import com.jayway.jsonpath.JsonPath;
> 代码片段
DocumentContext existingDoc = JsonPath.parse(json1);
DocumentContext incomingDoc = JsonPath.parse(json2);
existingDoc.delete("version");
incomingDoc.delete("version");
JsonNode existingNode = mapper.readTree(existingDoc.jsonString());
JsonNode incomingNode = mapper.readTree(incomingDoc.jsonString());
String diffs = JsonDiff.asJson(existingNode, incomingNode).toString();
logger.info("Difference: " + diffs);
英文:
I am successfully able to achieve it by using different libs :
> Imports
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.flipkart.zjsonpatch.JsonDiff;
import com.jayway.jsonpath.DocumentContext;
import com.jayway.jsonpath.JsonPath;
> Code snippet
DocumentContext existingDoc = JsonPath.parse(json1);
DocumentContext incomingDoc = JsonPath.parse(json2);
existingDoc.delete("version");
incomingDoc.delete("version");
JsonNode existingNode = mapper.readTree(existingDoc.jsonString());
JsonNode incomingNode = mapper.readTree(incomingDoc.jsonString());
String diffs = JsonDiff.asJson(existingNode, incomingNode).toString();
logger.info("Difference: " + diffs);
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论