我有一个方法可以获得两个Json节点,这些节点应该是不同大小的Json数组节点。 我需要检查ArrayA是否包含ArrayB的所有元素。我该怎么做?
private boolean isContains (JsonNode ArrayA, JsonNode ArrayB) {
if (ArrayA.isArray() && ArrayB.isArray()) {
// Here goes the missing code.
}
}
答案 0 :(得分:2)
JSON Patch反向部分可能会做你想要的。
请参阅:https://github.com/fge/json-patch#json-diff-factorization
编辑: 它很简单:
JsonNode diff = JsonDiff.asJson(first, second);
并且您可以检查diff
是否包含删除或添加或两者。
答案 1 :(得分:0)
似乎没有我能看到的内置方法,但是JsonNode
实现了Iteratable
,所以你可以遍历两者并进行比较。有点像:
boolean matches = true;
for (JsonNode nodeB : arrayB)
{
boolean matchesInternal = false;
for (JsonNode nodeA : arrayA)
{
if (nodeA.equals(nodeB))
{
matchesInternal = true;
break;
}
}
if (!matchesInternal) {
matches = false;
break;
}
}
return matches;
答案 2 :(得分:0)
您可以使用zjsonpatch库,它根据RFC 6902(JSON Patch)显示diff信息。它非常易于使用。请访问其描述页面了解其用法。 这个库比fge-json-patch(上面的答案中提到的)更好,因为它可以正确检测从数组中插入/删除的项目。
答案 3 :(得分:0)
对于那些面临同样问题但更喜欢更扁平代码的人。您可以使用Apache Commons 的IterableUtils.toList() 将ArrayNode#elements() 转换为List,然后执行List#containsAll() 操作来检查它们是否包含相同的元素。它看起来像这样:
sourceArray.size() == targetArray.size() && IteratorUtils.toList(sourceArray.elements()).containsAll(IteratorUtils.toList(targetArray.elements()))