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
      }
    ]
  }]
}

Мой вариант использования — найти все имена документов, для которых attr1 = true

Я попробовал пару выражений фильтра, но не могу получить имена документов. Я пробовал что-то вроде этого: $.DATA[?(@.result[0].attribute=='attr1' && @.result[0].value == true)].docName и я получаю docNames, но я не могу полагаться на 1-й элемент списка. Мне нужно проверить, присутствует ли где-нибудь в списке attr1 со значением true.

Любая помощь будет оценена по достоинству.


person AgentX    schedule 01.08.2018    source источник


Ответы (2)


После некоторого кодирования, а затем выяснения, почему это не работает, я точно выяснил, что в настоящее время с помощью jsonpath невозможно получить родительский элемент из фильтрующего дочернего узла (вложенный json). Открыть ссылку на задачу

В противном случае это могло бы сработать,

$.DATA[?(@.result[?(@.attribute=="attr1" && @.value==true)])].docName

person Helping hand    schedule 01.08.2018

jq очень похож на JSONpath, поэтому, возможно, решение jq будет помощь. По крайней мере, очень просто:

# find all the docNames for which the attr1 == true
.DATA[]
| select( any(.result[]; .attribute == "attr1" and .value == true) )
| .docName

привязки Java

person peak    schedule 02.08.2018
comment
См. обновление, но обратите внимание, что у меня нет личного опыта ни с одним из них. Сообщите нам о любых плюсах и минусах, с которыми вы столкнулись. - person peak; 02.08.2018