JSONの配列があり、次のように2つのフィルターを適用したいと思います。
$._embedded.values[0]._embedded.data[?(@.var1='value1' && @.var2='value2')]
AND演算を満たす要素のみを配列から選択する必要があります。ただし、実際にはこれは機能しないようです。
これを実行することは可能ですか、それとも2つのステップのアクションを実行して1つのセットを抽出し、再度フィルタリングして最終結果を取得する必要がありますか?
私の知る限り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とカテゴリ「フィクション」...完璧!)
[〜#〜] but [〜#〜]:変更:
$..book[?(@.category=='fiction'),?(@.price==8.99)]
出力は次のとおりです。
[
]
[、]はJayway JsonPath Testerとcuriousconcept.com式テスターでうまく実装されていないようです。
しかし、私が知っていることから、彼らはANDおよびまたは(issue27 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/
以下は、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'))]