Json Path - фильтр в списке
У меня есть JSON, как это:
{
"DATA": [
{
"docName": "xyz",
"result": [
{
"attribute": "attr1",
"value": true
},
{
"attribute": "attr2",
"value": true
}
]
},
{
"docName": "abc",
"result": [
{
"attribute": "attr1",
"value": false
},
{
"attribute": "attr2",
"value": true
}
]
}]
}
Мой вариант использования - найти все docNames, для которых attr1 = true
Я попробовал пару выражений фильтра, но я не могу получить названия документов. Я попробовал что-то вроде этого: $.DATA[?(@.result[0].attribute=='attr1' && @.result[0].value == true)].docName
и я получаю docNames, но я не могу полагаться на 1-й элемент списка. Мне нужно проверить, присутствует ли attr1 где-нибудь в списке со значением true.
Любая помощь будет оценена.
2 ответа
После некоторого кодирования, а затем выяснения, почему это не работает, я точно выяснил, что в настоящее время с помощью jsonpath невозможно получить родительский элемент от фильтрации дочернего узла (вложенного json). Ссылка на открытый выпуск
В противном случае это могло бы сработать,
$.DATA[?(@.result[?(@.attribute=="attr1" && @.value==true)])].docName
jq очень похож на JSONpath, так что, возможно, решение jq поможет. Это, по крайней мере, очень просто:
# find all the docNames for which the attr1 == true
.DATA[]
| select( any(.result[]; .attribute == "attr1" and .value == true) )
| .docName
Java-привязки
- https://github.com/eiiches/jackson-jq
- https://github.com/arakelian/java-jq (доступно в Maven Central)
- Оболочка Native Access для Java https://github.com/bskaggs/jjq. Поддерживаемая платформа только для Linux.