Jsonpath 以子字段条件获取父字段信息

Jsonpath to grab parent field info with condition on child field

对于给定的表达式,我们可以使用 jsonpath 来 select 值,对于以下示例和问题:

{
   "items": [
   {
      "id": 1,
      "name": "item1",
      "album": {
         "name": "Summer Trip",
         "meta": [
            {
             "name": "CreatedBy",
             "value": "Karen"
            },
            {
             "name": "Address",
             "value": "San Jose, CA"
            }
         ]
      }
   },
   {
      "id": 2,
      "name": "item2",
      "album": {
         "name": "Winter Trip",
         "meta": [
            {
             "name": "CreatedBy",
             "value": "Lola"
            },
            {
             "name": "Address",
             "value": "Seattle, WA"
            }
         ]
      }
   }

   ] 
}

我想过滤掉其专辑元条件为 name == "CreatedBy" and value == "Karen"return 项目 ID 和名称 的项目。例如:

{
   items: [
      {
         "id": 1,
         "name": "item1"
      }
   ]
}

通过查看 jsonpath 的工作原理,似乎一旦深入嵌套 JSON 节点,它就无法捕获父节点值,例如,我可以捕获像

这样的节点值
$..meta[?(@.name == 'CreatedBy' && @.value == "Karen")]

其中 return 使用 meta 中的对象而不是其父节点 items.

[
  {
     "name": "CreatedBy",
     "value": "Karen"
  }
]

是否可以使用 jsonpath 来实现我正在寻找的东西?

如果您正在使用 Jayway JSONPath,则可以使用过滤运算符。

contains 过滤运算符

$.items[?(@.album.meta[?(@.name=='CreatedBy')].value contains 'Karen')]['id','name']

in 过滤运算符

$.items[?('Karen' in @.album.meta[?(@.name=='CreatedBy')].value)]['id','name']

固定索引位置

$.items[*][?(@.album.meta[0].name=="CreatedBy" && @.album.meta[0].value=="Karen")]['id','name']

在线测试工具:Jayway JsonPath Evaluator