当前位置: 首页 > 知识库问答 >
问题:

Jackson:检查ArrayNode是否包含JsonNode

田德运
2023-03-14

我在我的Java应用程序中使用Jackson JSON库及其Tree Model系统(JsonNode)。在这种情况下,我需要检查ArrayNode是否包含给定的JsonNode。我正在浏览JavaDocs,并且没有看到ArrayNode的任何类型的。包含()方法。我最终自己写了一个包含方法:

   public static boolean arrayNodeContains(ArrayNode arrayNode, JsonNode node) {
      Stream<JsonNode> nodeStream = StreamSupport.stream(arrayNode.spliterator(), false);
      return nodeStream.anyMatch(j -> j.equals(node));
   }

单元测试:

   @Test
   public void testArrayNodeContains()
         throws IOException
   {
      ObjectMapper mapper = new ObjectMapper;

      String arrayJsonString = "[{\"foo\":\"bar\"},{\"foo\":\"baz\"},{\"baz\":\"bar\"}]";
      String nodeTrueJsonString = "{\"foo\":\"bar\"}";
      String nodeFalseJsonString = "{\"foo\":\"brains\"}";
      List<Object> list = mapper.readValue(arrayJsonString, List.class);
      ArrayNode arrayNode = mapper.valueToTree(list);

      Map<String, Object> nodeTrueMap = mapper.readValue(nodeTrueJsonString, Map.class);
      JsonNode nodeTrue = mapper.valueToTree(nodeTrueMap);

      assertTrue(arrayNodeContains(arrayNode, nodeTrue));

      Map<String, Object> nodeFalseMap = mapper.readValue(nodeFalseJsonString, Map.class);
      JsonNode nodeFalse = mapper.valueToTree(nodeFalseMap);
      assertFalse(arrayNodeContains(arrayNode, nodeFalse));
   }

我是否错过了杰克逊的一些东西,我正在复制一些我错过的图书馆方法。否则,还有比我做的更好的方法吗?

共有1个答案

督瑞
2023-03-14

有一个选项是使用equals方法与JsonNode和比较器

使用传入的比较器对象调用可自定义比较的入口方法。节点将处理结构化类型(数组、对象)的遍历,但在标量值比较时遵从比较器

新的增强790用于添加JsonNode.equals(比较器,JsonNode)以支持可配置/外部相等比较:

 // but. Custom comparator can make all the difference
    Comparator<JsonNode> cmp = new Comparator<JsonNode>() {
        @Override
        public int compare(JsonNode o1, JsonNode o2) {
            if (o1.equals(o2)) {
                return 0;
            }
            if ((o1 instanceof NumericNode) && (o2 instanceof NumericNode)) {
                double d1 = ((NumericNode) o1).asDouble();
                double d2 = ((NumericNode) o2).asDouble();
                if (d1 == d2) { // strictly equals because it's integral value
                    return 1;
                }
            }
            return 0;
        }
    };
    // but with custom comparator, yes
    assertTrue(root1.equals(cmp, root2));
 类似资料:
  • 问题内容: 给定一个整数,如何使用Java检查它是否包含0? 如何才能做到这一点? 问题答案: 您是说小数表示形式是否包含0?绝对 最简单的 方法是: 别忘了一个数字并不“固有地”包含一个0或不包含0(当然,零本身除外)-它取决于底数。因此,十进制的“ 10”是十六进制的“ A”,而十六进制的“ 10”是十进制的“ 16”……在两种情况下,结果都会改变。 在整数的十进制表示形式中,可能有更有效的方

  • 问题内容: 如何检查字符串是否包含\ n或换行符? 问题答案: 如果字符串是在同一程序中构造的,则建议使用以下命令: 但是,如果您指定使用\ n,则此驱动程序说明了如何做: 导致 回应您的评论: 结果是

  • 我正在寻找一个运算符,它允许我检查字段的值是否包含某个字符串。 比如: 可能吗?

  • 本文向大家介绍检查Java ArrayList是否包含给定项,包括了检查Java ArrayList是否包含给定项的使用技巧和注意事项,需要的朋友参考一下 java.util.ArrayList.contains()方法可用于检查Java ArrayList是否包含给定项。此方法具有单个参数,即测试了其在ArrayList中是否存在的项目。如果该项目在ArrayList中存在,则返回true;如果

  • 所以我一辈子也想不出来。我正在尝试编写一个程序,提示用户输入电话号码。这将作为字符串输入,并在稍后的程序中转换为整数数组。然而,我现在遇到的情况是验证用户输入的字符串是否仅限于!!!包含2-9之间的数字。我已经尝试了。Contains方法和。Match方法,但是使用这些方法总是提供错误的结果。如果有人能提供一些关于如何解决这个问题,我将非常感谢。提前感谢。 以下是我目前掌握的信息:

  • 问题内容: 我正在实现是否有位图,那么它应该将图像从imageview保存到内部存储器,否则在应用程序的内部存储器中设置另一个位图。这是代码:_ 问题答案: 您可以按以下方式检查它: 只需检查Bitmap值,如下所示: