Фильтр JsonNode Array в Джексоне без итерации - PullRequest
0 голосов
/ 05 октября 2018

Json:

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

Я просто хочу получить название книги в виде строки, когда ключ = "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 Ответ

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

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

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

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

...