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'))]
Другие вопросы по тегам