#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 Оценщик