比较Java中的两个JsonArray节点

时间:2014-11-09 20:11:45

标签: java json jackson

我有一个方法可以获得两个Json节点,这些节点应该是不同大小的Json数组节点。 我需要检查ArrayA是否包含ArrayB的所有元素。我该怎么做?

private boolean isContains (JsonNode ArrayA, JsonNode ArrayB) {

    if (ArrayA.isArray() && ArrayB.isArray()) {
        // Here goes the missing code.
    }
}

4 个答案:

答案 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()))