1

对于以下示例和问题,我们可以使用 jsonpath 为给定表达式选择值:

{
   "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",并返回项目 id 和 name。例如:

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

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

$..meta[?(@.name == 'CreatedBy' && @.value == "Karen")]

它返回了meta内的对象,而不是它的父节点items

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

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

4

1 回答 1

1

如果您使用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

于 2021-11-29T08:22:07.547 回答