web-dev-qa-db-ja.com

配列のJsonPath AND演算子

JSONの配列があり、次のように2つのフィルターを適用したいと思います。

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

AND演算を満たす要素のみを配列から選択する必要があります。ただし、実際にはこれは機能しないようです。

これを実行することは可能ですか、それとも2つのステップのアクションを実行して1つのセットを抽出し、再度フィルタリングして最終結果を取得する必要がありますか?

11
Mike Chinaloy

私の知る限り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コードで)の(実際の)実装に取り​​組んでいます。

これで少なくとも何かが明確になることを願っています!

3
stefankmitph

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/

14
kalle

以下は、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'))]
3
Karthik Kamath