Джексон: проверьте, содержит ли ArrayNode JsonNode

Я использую библиотеку Джексон JSON и ее систему Модель дерева (JsonNode) в своем приложении Java. В этом случае мне нужно проверить, содержит ли ArrayNode данный JsonNode. Я просматривал JavaDocs и не нашел никакого метода .contains() для 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));
   }

Я что-то пропустил в Джексоне, и я дублирую какой-то библиотечный метод, который пропустил. В противном случае, есть ли лучший способ сделать это, чем то, что сделал я?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
5
0
5 580
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Есть возможность использовать метод равно с JsonNode и Comparator

Entry method for invoking customizable comparison, using passed-in Comparator object. Nodes will handle traversal of structured types (arrays, objects), but defer to comparator for scalar value comparisons

Новое расширение 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));

Другие вопросы по теме