Как в JSONPath обратиться к родительскому объекту, если дочерний удовлетворяет условию
Если ознакомиться со спецификацией RFC 9535 JSONPath и её реализацией, то можно обнаружить, что в JSONPath нет простого способа обратиться к родителю, как в XPath. Но есть способы похитрее, которые работают в зависимости от реализации.
Пример JSON.
{
"key": "value#parent",
"value": [
{
"key": "value#child1"
},
{
"key": "value#child2"
}
]
}
Задача
Получить значение родительского узла /key
, если хотя бы один из дочерних объектов /value/0
или /value/1
удовлетворят условию /value/0/key=='value#child2'
или /value/1/key=='value#child2'
.
Способ №1
Использовать Jayway реализацию JSONPath для Java, которая поддерживает некоторые функции, например empty
.
Запрос.
$..[?(@.value[?(@.key=='value#child2')] empty false)].key
Результат.
[
"value#parent"
]
Ключевое выражение @.value[?(@.key=='value#child2')] empty false
позволяет проверить, что список подходящих дочерних объектов не пустой.
Способ №2
Работает, если дочерние объекты не являются элементами списка и для нашего примера не подходит. С ним можно ознакомиться на Stack Overflow, а поэкспериментировать на сайте JSONPath Online Evaluator.