Джексон: проверьте, содержит ли ArrayNode JsonNode - PullRequest
0 голосов
/ 31 октября 2018

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

0 голосов
/ 31 октября 2018

Существует возможность использования метода равно с JsonNode и Comparator

Метод ввода для вызова настраиваемого сравнения с использованием переданного объекта 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));
...