JsonPath AND Оператор в массиве

У меня есть массив в JSON, и я хотел бы применить к нему два фильтра вот так:

$._embedded.values[0]._embedded.data[?(@.var1='value1' && @.var2='value2')]

Мне нужно выбрать только те элементы из массива, которые удовлетворяют операции AND. Однако на практике это не работает.

Можно ли это сделать или я должен выполнить двухэтапное действие, чтобы извлечь один набор, а затем снова отфильтровать его, чтобы получить окончательные результаты?


person Mike Chinaloy    schedule 17.04.2015    source источник


Ответы (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.

Но насколько я знаю, они работают над (реальной) реализацией И и или (issue27 здесь в коде Google).

Надеюсь, это хоть что-то проясняет!

person stefankmitph    schedule 17.04.2015
comment
Спасибо, вы в значительной степени подтвердили мои подозрения, и приятно знать, что я не делал чего-то совершенно глупого. В моем случае кажется, что он просто не работает, даже если я попытаюсь переключить атрибуты. - person Mike Chinaloy; 17.04.2015
comment
В качестве альтернативы я обнаружил, что могу достичь того, что мне нужно, используя предикаты фильтра в моем Java-коде. - person Mike Chinaloy; 17.04.2015
comment
да ... если у вас есть что-то (например, java, c # ...) для дальнейшей обработки результатов, это не так уж плохо, что операторы не работают ... - person stefankmitph; 17.04.2015
comment
Согласно goessner.net/articles/JsonPath/index.html#e2, оператор [,] выполняет объединение. Это означает, что он будет работать как ИЛИ, а не как И, на который ссылается этот вопрос. - person Zé Carlos; 26.02.2018

Реализация Jayway поддерживает встроенные критерии И и ИЛИ.

$..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/

person kalle    schedule 20.04.2015
comment
Потрясающе, большое спасибо. Онлайн-реализация jspnpath очень чистая и отлично работает. - person Beezer; 27.11.2017

ниже приведен пример, показывающий путь JSON с критериями И и ИЛИ:

Получите все книги по цене менее 10 и категории "художественная литература"

$..book[?(@.price<10 && @.category=='fiction')]

Получите все книги по цене менее 10 или любую книгу категории "художественная литература"

$..book[?(@.price<10 || @.category=='fiction')]  

Вы также можете попробовать смешать критерии И и ИЛИ:

Приобретайте книги Германа Мелвилла по цене меньше 10 или его книгу категории "художественная литература".

$..book[?(@.author=='Herman Melville' && (@.price<10 || @.category=='fiction'))]
person Karthik Kamath    schedule 03.07.2018