JsonPath и оператор на массиве
У меня есть массив в JSON, и я хотел бы применить к нему два фильтра следующим образом:
$._embedded.values[0]._embedded.data[?(@.var1='value1' && @.var2='value2')]
Мне нужно выбрать только те элементы из массива, которые удовлетворяют операции AND. Однако на практике это не работает.
Возможно ли это сделать или я должен выполнить двухшаговое действие, чтобы извлечь один набор, а затем снова отфильтровать, чтобы получить мои окончательные результаты?
3 ответа
Насколько я знаю, И / ИЛИ пока не поддерживаются. Но вы можете сравнительно приблизиться к этому массиву [,]. Но даже это заставило меня задуматься, когда я это проверил. Там какое-то странное поведение. Я взял пример JSON-строки из Jayway JsonPath Evaluator и поместил ее в JsonPath Expression Tester (потому что он не работал с Jayway, когда я пытался).
Итак, JSON, который я протестировал с версией curiousconcept:
{
"store": {
"book": [
{
"category": "reference",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": 8.95
},
{
"category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99
},
{
"category": "fiction",
"author": "Herman Melville",
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"price": 8.99
},
{
"category": "fiction",
"author": "J. R. R. Tolkien",
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"price": 22.99
}
],
"bicycle": {
"color": "red",
"price": 19.95
}
},
"expensive": 10
}
И выражение:
$..book[?(@.price==8.99),?(@.category=='fiction')]
что приводит к:
[
{
"category":"fiction",
"author":"Herman Melville",
"title":"Moby Dick",
"isbn":"0-553-21311-3",
"price":8.99
}
]
что кажется идеальным. (возьмите цену 8.99 И категорию "художественная литература"... идеально!)
НО: измените его на:
$..book[?(@.category=='fiction'),?(@.price==8.99)]
тогда вывод:
[
]
Мне кажется, что [,] не очень хорошо реализован в Jayway JsonPath Tester, а также в тестере выражений curiousconcept.com.
Но насколько я знаю, они работают над (реальной) реализацией AND и or (проблема 27 здесь, в коде Google).
Надеюсь, это прояснит хоть что-то!
Реализация Jayway поддерживает встроенные критерии AND и OR.
$..book[?(@.price==8.99 && @.category=='fiction')]
[
{
"category" : "fiction",
"author" : "Herman Melville",
"title" : "Moby Dick",
"isbn" : "0-553-21311-3",
"price" : 8.99
}
]
Попробуйте и сравните различные реализации здесь http://jsonpath.herokuapp.com/
Ниже приведен пример, показывающий путь JSON с критериями AND и OR:
Получить все книги стоимостью менее 10 и категории "художественная литература"
$..book[?(@.price<10 && @.category=='fiction')]
Получить все книги по цене менее 10 или любую книгу категории "художественная литература"
$..book[?(@.price<10 || @.category=='fiction')]
Вы также можете попробовать смешать критерии И и Или:
Получить книги "Герман Мелвилл" по цене менее 10 или его книгу категории "художественная литература"
$..book[?(@.author=='Herman Melville' && (@.price<10 || @.category=='fiction'))]