数组上的 JsonPath AND 运算符

JsonPath AND Operator on Array

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

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

我只需要 select 数组中满足 AND 运算的那些元素。但是,实际上这似乎不起作用。

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

据我所知还不支持 AND / OR。但是你可以相对接近这个 [] 数组。但即便如此,我在测试时也感到疑惑。有一些奇怪的行为。我从 Jayway JsonPath Evaluator and put it into JsonPath Expression Tester 中获取了一个示例 JSON 字符串(因为我尝试时它不适用于 Jayway)。

所以我用 curiousconcept 版本测试的 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
}

表达式:

$..book[?(@.price==8.99),?(@.category=='fiction')]

这导致:

[  
   {  
      "category":"fiction",
      "author":"Herman Melville",
      "title":"Moby Dick",
      "isbn":"0-553-21311-3",
      "price":8.99
   }
]

看起来很完美。 (价格 8.99 AND 类别 'fiction'...完美!)

但是:将其更改为:

$..book[?(@.category=='fiction'),?(@.price==8.99)]

那么输出是:

[
]

在我看来,[] 在 Jayway JsonPath 测试器和 curiousconcept.com 表达式测试器中没有很好地实现。

但据我所知,他们正在研究 AND 和 or 的(实际)实现(问题 27 here 在 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 且属于 'fiction' 类别的图书

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

获取价格小于 10 的所有书籍或 'fiction' 类别的任何书籍

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

您也可以尝试混合使用 AND 和 Or 标准:

购买价格低于 10 的 'Herman Melville' 的书或他 'fiction' 类别的书

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