Jsonpath для получения информации о родительском поле с условием для дочернего поля

#jsonpath #json-path-expression

Вопрос:

Мы можем использовать jsonpath для выбора значений для заданных выражений в следующем примере и вопросе:

 {
   "items": [
   {
      "id": 1,
      "name": "item1",
      "album": {
         "name": "Summer Trip",
         "meta": [
            {
             "name": "CreatedBy",
             "value": "Karen"
            },
            {
             "name": "Address",
             "value": "San Jose, CA"
            }
         ]
      }
   },
   {
      "id": 2,
      "name": "item2",
      "album": {
         "name": "Winter Trip",
         "meta": [
            {
             "name": "CreatedBy",
             "value": "Lola"
            },
            {
             "name": "Address",
             "value": "Seattle, WA"
            }
         ]
      }
   }

   ] 
}
 

Я хотел бы отфильтровать элементы , для которых мета-формат альбома указан как name == "CreatedBy" and value == "Karen" , и вернуть идентификатор и имя элемента. Например:

 {
   items: [
      {
         "id": 1,
         "name": "item1"
      }
   ]
}
 

Глядя на то, как работает jsonpath, кажется, что, как только вы углубляетесь во вложенные узлы JSON, он не может уловить значение родительского узла, например, я могу уловить значения узлов, такие как

 $..meta[?(@.name == 'CreatedBy' amp;amp; @.value == "Karen")]
 

который вернул мне объект внутри мета, а не его элементы родительского узла.

 [
  {
     "name": "CreatedBy",
     "value": "Karen"
  }
]
 

Можно ли использовать jsonpath для достижения того, что я ищу?

Комментарии:

1. Самый близкий вопрос, который я получил, был $.items[*][?(@.album.meta[0].name=="CreatedBy" amp;amp; @.album.meta[0].value=="Karen")]['id','name'] . Работает только в том случае, если CreatedBy находится в одной и той же позиции индекса в каждых метаданных. Попробовал с реализацией Jayway JSONPath. jsonpath.herokuapp.com . Может не работать с другими реализациями

2. Это действительно выглядит хорошо, большое спасибо!

Ответ №1:

Если вы используете Jayway JSONPath, вы можете использовать операторы фильтрации.

contains оператор фильтра

 $.items[?(@.album.meta[?(@.name=='CreatedBy')].value contains 'Karen')]['id','name']
 

in оператор фильтра

 $.items[?('Karen' in @.album.meta[?(@.name=='CreatedBy')].value)]['id','name']
 

Фиксированное положение индекса

 $.items[*][?(@.album.meta[0].name=="CreatedBy" amp;amp; @.album.meta[0].value=="Karen")]['id','name']
 

Онлайн-инструмент тестирования : Jayway JSONPath Оценщик