我有一个JSON数组,我想像这样应用两个过滤器:
$._embedded.values[0]._embedded.data[?(@.var1='value1' && @.var2='value2')]
我只需要从数组中选择满足AND运算的那些元素。但是,在实践中,这似乎不起作用。
是否可以执行此操作,还是必须执行两步操作以提取一组然后再次过滤以获得最终结果?
答案 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'))]