数组上的JsonPath AND运算符

时间:2015-04-17 15:49:12

标签: jsonpath

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

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

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

是否可以执行此操作,还是必须执行两步操作以提取一组然后再次过滤以获得最终结果?

3 个答案:

答案 0 :(得分:13)

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/

答案 1 :(得分:2)

据我所知,AND / OR尚未得到支持。但是你可以通过这个[,]数组得到相对接近的结果。但即便如此,让我想知道我何时测试它。有一些奇怪的行为。我从Jayway JsonPath Evaluator中获取了一个示例JSON字符串并将其放入JsonPath Expression Tester(因为当我尝试时它与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和类别'小说'......完美!)

但是:将其更改为:

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

然后输出是:

[
]

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

但据我所知,他们正致力于(或真实)实施AND和or(在Google代码中发布27 here)。

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

答案 2 :(得分:2)

以下是显示具有AND和OR条件的JSON路径的示例:

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

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

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

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

您还可以尝试将AND和Or准则混在一起:

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

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