数组上的JsonPath AND运算符

Mik*_*loy 8 jsonpath

我有一个JSON数组,我想像这样应用两个过滤器:

$._embedded.values[0]._embedded.data[?(@.var1='value1' && @.var2='value2')]
Run Code Online (Sandbox Code Playgroud)

我只需要从数组中选择满足AND运算的那些元素.但是,在实践中,这似乎不起作用.

是可以这样做还是我必须执行两步操作来提取一组然后再次过滤以获得我的最终结果?

小智 15

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
   }
]
Run Code Online (Sandbox Code Playgroud)

尝试一下,比较不同的实现http://jsonpath.herokuapp.com/


小智 7

下面是一个示例,显示了带有 AND 和 OR 条件的 JSON 路径:

获取所有价格低于 10 且属于“小说”类别的书籍

$..book[?(@.price<10 && @.category=='fiction')]
Run Code Online (Sandbox Code Playgroud)

获取所有价格低于 10 的书籍或任何“小说”类别的书籍

$..book[?(@.price<10 || @.category=='fiction')]  
Run Code Online (Sandbox Code Playgroud)

您还可以尝试混合 AND 和 Or 条件:

获得价格低于 10 的“赫尔曼梅尔维尔”书籍或他的“小说”类书籍

$..book[?(@.author=='Herman Melville' && (@.price<10 || @.category=='fiction'))]
Run Code Online (Sandbox Code Playgroud)


ste*_*tph 4

据我所知,尚不支持 AND / OR。但你可以通过这个 [,] 数组获得相对接近的结果。但即便如此,当我测试它时,我还是想知道。有一些奇怪的行为。我从Jayway JsonPath Evaluator中获取了一个示例 JSON 字符串,并将其放入JsonPath Expression Tester中(因为当我尝试时它无法与 Jayway 一起使用)。

所以我用好奇概念版本测试的 JSON 是:

{
    "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
}
Run Code Online (Sandbox Code Playgroud)

以及表达式:

$..book[?(@.price==8.99),?(@.category=='fiction')]
Run Code Online (Sandbox Code Playgroud)

结果是:

[  
   {  
      "category":"fiction",
      "author":"Herman Melville",
      "title":"Moby Dick",
      "isbn":"0-553-21311-3",
      "price":8.99
   }
]
Run Code Online (Sandbox Code Playgroud)

看起来很完美。(价格为 8.99,类别为“小说”……完美!)

但是:将其更改为:

$..book[?(@.category=='fiction'),?(@.price==8.99)]
Run Code Online (Sandbox Code Playgroud)

那么输出是:

[
]
Run Code Online (Sandbox Code Playgroud)

在我看来,[,] 在 Jayway JsonPath Tester 以及好奇概念.com 表达式测试器中没有得到很好的实现。

但据我所知,他们正在研究 AND 和 or 的(真正的)实现(谷歌代码中的 Issue27

希望这至少能澄清一些事情!