You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用jq或CEL筛选含city_x的嵌套JSON payload.*节点

使用jq筛选符合条件的JSON节点

核心需求

筛选JSON结构中payload下的所有节点,要求该节点的任意子节点的cities数组中,存在name值为city_x的元素。无论输入的嵌套结构如何,最终输出结果需保持一致。

通用jq解决方案

直接使用递归遍历+条件筛选的jq表达式即可实现需求:

.payload[] | select(.. | .cities? | any(.[]; .name == "city_x"))

表达式拆解

  • .payload[]:遍历payload下的所有直接子节点
  • select(...):仅保留满足条件的节点
  • .. | .cities?:递归遍历当前节点的所有后代元素,获取所有存在的cities数组(?用于忽略无cities属性的节点,避免报错)
  • any(.[]; .name == "city_x"):检查cities数组中是否存在至少一个元素的name等于city_x,只要有一个满足就返回true

示例验证

示例输入1(深层嵌套结构)

{
  "payload": [
    {
      "id": "node1",
      "details": {
        "cities": [{"name": "city_a"}, {"name": "city_x"}]
      }
    },
    {
      "id": "node2",
      "info": {
        "subinfo": {
          "cities": [{"name": "city_b"}]
        }
      }
    }
  ]
}

执行jq命令后输出:

{
  "id": "node1",
  "details": {
    "cities": [{"name": "city_a"}, {"name": "city_x"}]
  }
}

示例输入2(混合嵌套结构)

{
  "payload": [
    {
      "id": "node3",
      "cities": [{"name": "city_c"}, {"name": "city_x"}]
    },
    {
      "id": "node4",
      "data": [
        {"cities": [{"name": "city_d"}]},
        {"other": {"cities": [{"name": "city_x"}]}}
      ]
    },
    {
      "id": "node5",
      "meta": {"value": "foo"}
    }
  ]
}

执行jq命令后输出:

{
  "id": "node3",
  "cities": [{"name": "city_c"}, {"name": "city_x"}]
}
{
  "id": "node4",
  "data": [
    {"cities": [{"name": "city_d"}]},
    {"other": {"cities": [{"name": "city_x"}]}}
  ]
}

补充说明

  • 该表达式不限制cities数组的嵌套层级,无论目标数组在节点的哪一层后代中,都能被检测到
  • 如果需要严格匹配(区分大小写、精确字符串),直接使用当前表达式即可;若需模糊匹配,可将==替换为test()函数

内容的提问来源于stack exchange,提问作者mohit nagpal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 22:22:09