Фильтровать массив 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.