Фильтровать массив JsonNode в Джексоне без итерации

Json:

{  
   "type":"book",
   "children":[  
      {  
         "key":"123",
         "name":"book1"
      },
      {  
         "key":"456",
         "name":"book2"
         ]
      }
   ]
}

Я просто хочу получить название книги в виде строки, когда key = "456".

Вот что у меня есть:

JsonNode root = mapper.readTree(investigation.getFilterModel());
JsonNode children = root.path("children");
            if (children.isArray())
            {
                for (final JsonNode objNode : children)
                {
                    if ("456".equalsIgnoreCase(objNode.path("key").textValue()))
                    {
                        String bookName = objNode.path("name").textValue();
                    }
                }
            }

Это работает для меня. Я просто хочу знать, есть ли более чистый способ сделать это без цикла по всему массиву детей? Поскольку размер массива может быть большим.

1 ответ

Решение

Такой запрос не был бы возможен с Джексоном. Вы можете максимально использовать JsonPointer Выражение с ним, когда вы знаете индекс массива, где лежит элемент:

root.at("/children/1/name");

Вы можете использовать выражение JsonPath $.children[?(@.key==456)].name для вашего запроса, который поддерживается в библиотеке Jayway JsonPath.

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