【问题标题】:Goessner JSONPath nested filter to return sibling nodeGoessner JSONPath 嵌套过滤器返回兄弟节点
【发布时间】:2020-05-26 10:03:25
【问题描述】:

我有这个骨架 JSON 文件,我需要使用 JSONPath 使用externalids.system=='HQ2' 进行过滤。我也在使用Goessner

{
  "meta": {
    "numFound": 2
  },
  "data": [
    {
      "id": "11111",
      "type": "PRODUCT_GROUP",
      "values": [
        {
          "showvalues": [
            "ObjectPosition"
          ],
          "value": "4",
          "attributeid": "gd4d20ffc-0374-4764-8b01-19b2e3d9d084"
        }
      ],
      "_links": [
        {
          "rel": "self"
        }
      ],
      "externalids": [
        {
          "system": "HQ1"
        }
      ]
    },
    {
      "id": "22222",
      "type": "PRODUCT_GROUP",
      "values": [
        {
          "showvalues": [
            "ObjectPosition"
          ],
          "value": "4",
          "attributeid": "gd4d20ffc-0374-4764-8b01-19b2e3d9d084"
        }
      ],
      "_links": [
        {
          "rel": "self"
        }
      ],
      "externalids": [
        {
          "system": "HQ2"
        }
      ]
    }
  ]
}

有人可以帮助我为什么这不起作用吗?

$.data[?(@.externalids[?(@.system == 'HQ2')])].values

基本上,我需要所有externalids.system=='HQ2' 中的values

【问题讨论】:

  • 似乎 JSONPath(所有版本)不接受嵌套/多个条件/谓词。如果您可以使用 JSONPath Plus,您就可以足够接近您的需求。

标签: json jsonpath


【解决方案1】:

我知道这是旧的,但有人可能仍然感兴趣,事实证明,它实际上是可行的!

  1. 好的,按照要求,使用 Goessner 的实现,我们可以从具有 externalids.system==HQ2 属性的数据对象中查询 values,如下所示:

    $.data[?( @.externalids && @.externalids.some(e => e.system=='HQ2') )].values
    

    这有点棘手:在过滤 externalids 之后,使用带有箭头功能的 .some() (ES5) 使用 JS 脚本评估来搜索项目。整齐,哈?在线测试on the Goessner tab


  1. 在 Jayway 的 JsonPath 实现中,我们可以使用相同的想法,但需要稍微不同的语法:

    $.data[?(@.externalids && @..system contains 'HQ2')].values
    

    虽然此解决方案非常相似,但它更容易出现误报,因为我们正在递归搜索 system 属性。使用同一个站点测试它on the Jayway tab


  1. 而且,如前所述,如果我们使用功能更丰富的实现,例如 JSONPath-Plus,事情会变得更容易,例如利用 ^ 父节点运算符:

    $..externalids[?(@.system==='HQ2')]^^^.values
    

    获取所有externalids对象并过滤属性,然后多次向上直到我们在data下有对象用于过滤values。这个可以在线测试here

因此,如果我们愿意应用某些变通方法,这是非常容易实现的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-12
    • 2019-08-10
    • 2014-02-05
    • 2020-07-22
    • 2017-06-07
    • 1970-01-01
    • 2022-06-21
    • 1970-01-01
    相关资源
    最近更新 更多