【问题标题】:JsonPath AND Operator on Array数组上的 JsonPath AND 运算符
【发布时间】:2015-06-24 13:57:32
【问题描述】:

我有一个 JSON 数组,我想对它应用两个过滤器,如下所示:

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

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

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

【问题讨论】:

    标签: jsonpath


    【解决方案1】:

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

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

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

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

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

    您也可以尝试混合 AND 和 Or 条件:

    获取价格低于 10 的“Herman Melville”书籍或他的“小说”类书籍

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

    【讨论】:

      【解决方案2】:

      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/

      【讨论】:

      • 太棒了,非常感谢。 jspnpath 在线实现非常干净,效果很好。
      【解决方案3】:

      据我所知,尚不支持 AND / OR。但是您可以使用这个 [,] 数组相对接近。但即使这让我想知道当我测试它时。有一些奇怪的行为。我从Jayway JsonPath Evaluator 中提取了一个示例JSON 字符串并将其放入JsonPath Expression Tester 中(因为在我尝试时它不适用于Jayway)。

      所以我用好奇概念版本测试的 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 测试器以及好奇概念.com 表达式测试器中没有很好地实现。

      但据我所知,他们正在(真正的)实现 AND 和 or(issue27 here at google code)。

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

      【讨论】:

      • 谢谢,你几乎证实了我的怀疑,很高兴知道我没有做完全愚蠢的事情。对于我的用例,即使我尝试切换属性,它似乎也根本不起作用。
      • 另外,我发现我可以通过在我的 Java 代码中使用过滤谓词来实现我需要的目标
      • 是的...如果您有一些东西(如 java、c#...)来进一步处理结果,那么操作员不工作也不算太糟糕...
      • 根据goessner.net/articles/JsonPath/index.html#e2,运算符 [,] 执行联合。这意味着它将作为 OR 而不是该问题所指的 AND。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-20
      • 1970-01-01
      • 1970-01-01
      • 2014-04-22
      • 2019-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多