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-привязки

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