【问题标题】:Jackson: Check if ArrayNode contains JsonNodeJackson:检查 ArrayNode 是否包含 JsonNode
【发布时间】:2018-10-30 22:21:33
【问题描述】:

我在我的 Java 应用程序中使用Jackson JSON 库及其树模型 系统 (JsonNode)。在此,我需要检查ArrayNode 是否包含给定的JsonNode。我正在查看 JavaDocs,但我没有看到 ArrayNode 的任何类型的 .contains() 方法。我最终自己编写了一个包含方法:

   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));
   }

我是否错过了 Jackson 中的某些内容,并且正在复制一些我错过的库方法。否则,有没有比我做的更好的方法?

【问题讨论】:

    标签: java jackson objectmapper jsonnode


    【解决方案1】:

    可以选择在 JsonNode 和 Comparator 中使用 equals 方法

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

    新的增强功能 790 用于添加 JsonNode.equals(Comparator, 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));
    

    【讨论】:

      猜你喜欢
      • 2013-05-23
      • 2019-01-04
      • 2014-10-08
      • 2020-01-09
      • 2013-08-04
      • 2011-11-10
      • 2020-01-17
      • 2017-08-04
      • 2011-07-15
      相关资源
      最近更新 更多