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

jq 1.5:未知父级时通过正则查找嵌套元素并添加子对象

解决jq递归查找第一个ccc对象并更新其子元素的问题

嘿,我来帮你搞定这个困扰你的jq问题!你遇到的jq: error (at <stdin>:1): number (0) cannot be matched, as it is not a string错误,本质是因为你的JSON里存在数组结构,当递归查找时遇到了数字类型的数组索引,但之前的jq命令没正确处理这种数字路径,导致匹配失败。

核心解决方案

要在未知嵌套层级和父键名的情况下,找到第一个包含ccc键的对象(或者说第一个ccc对象),并给它的ddd子元素添加新内容,可以用以下jq命令:

情况1:ddd是数组(添加新元素)

jq '
  (first(.. | select(type == "object" and has("ccc")))).ccc.ddd += [{"new_key": "new_value"}]
' your_input.json

情况2:ddd是对象(添加新键值对)

jq '
  (first(.. | select(type == "object" and has("ccc")))).ccc.ddd += {"new_key": "new_value"}
' your_input.json

命令解释

  • ..:递归遍历JSON的所有节点,不管嵌套多深,也不管是对象还是数组
  • select(type == "object" and has("ccc")):筛选出所有包含ccc键的对象(避免误匹配数组或其他类型节点)
  • first():只取第一个符合条件的对象,确保我们只修改第一个找到的ccc对象
  • .ccc.ddd += ...:对目标ccc对象下的ddd执行添加操作,根据ddd的类型选择数组或对象的添加语法

示例演示

假设你的输入JSON是这样的:

{
  "top_level": {
    "nested_array": [
      {
        "ccc": {
          "ddd": [{"existing_item": "old_val"}]
        }
      },
      {
        "ccc": {
          "ddd": []
        }
      }
    ]
  }
}

运行第一个命令后,输出会变成:

{
  "top_level": {
    "nested_array": [
      {
        "ccc": {
          "ddd": [
            {"existing_item": "old_val"},
            {"new_key": "new_value"}
          ]
        }
      },
      {
        "ccc": {
          "ddd": []
        }
      }
    ]
  }
}

可以看到只有第一个ccc对象的ddd数组被添加了新元素。

为什么之前会报错?

你之前的命令可能使用了路径相关的操作(比如paths或getpath),但没有处理数组的数字索引——jq的路径中数组索引是数字类型,如果你尝试把它当作字符串来匹配或操作,就会触发这个错误。而上面的方案用..和select直接遍历节点,避开了路径字符串匹配的问题,自然不会报错。

内容的提问来源于stack exchange,提问作者art vanderlay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:23:01