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

如何用jq更新嵌套及部分扁平化对象中的值?

用单个jq查询处理多结构JSON的version替换需求

完全可以用单个jq查询实现这个需求,不管JSON是扁平化还是嵌套结构,都能精准替换version属性值为同层级settings.image的值,同时完整保留原文档的格式和其他字段。

核心解决方案

使用jq的递归遍历能力,配合条件判断实现批量替换。这里提供两种写法,适配不同jq版本:

写法1(jq 1.6+ 推荐)

利用内置的walk函数递归遍历所有JSON节点,匹配到符合条件的对象时执行替换:

walk(
  if type == "object" 
  and has("version") 
  and has("settings") 
  and .settings | has("image") 
  then .version = .settings.image 
  else . end
)

写法2(兼容低版本jq)

如果你的jq版本低于1.6,没有内置walk函数,可以自定义递归函数实现相同效果:

def update_version:
  if type == "object" then
    # 检查当前对象是否同时有version、settings及settings.image
    if has("version") and has("settings") and .settings | has("image") then
      .version = .settings.image
    else
      .
    end | with_entries(.value |= update_version)
  elif type == "array" then
    map(update_version)
  else
    .
  end;

update_version

示例验证

示例1:扁平化结构输入

输入JSON:

{
  "name": "web-app",
  "version": "v1.0.0",
  "settings": {
    "image": "web-app:v2.1.3",
    "port": 8080
  }
}

执行jq命令后的输出:

{
  "name": "web-app",
  "version": "web-app:v2.1.3",
  "settings": {
    "image": "web-app:v2.1.3",
    "port": 8080
  }
}

示例2:多层嵌套结构输入

输入JSON:

{
  "cluster": {
    "apps": [
      {
        "id": "auth-service",
        "version": "old-release",
        "settings": {
          "image": "auth-service:v3.0",
          "replicas": 2
        }
      },
      {
        "id": "payment-service",
        "version": "v0.9",
        "settings": {
          "image": "payment-service:stable"
        }
      }
    ],
    "metadata": {
      "version": "cluster-v1",
      "settings": {}
    }
  }
}

执行jq命令后的输出:

{
  "cluster": {
    "apps": [
      {
        "id": "auth-service",
        "version": "auth-service:v3.0",
        "settings": {
          "image": "auth-service:v3.0",
          "replicas": 2
        }
      },
      {
        "id": "payment-service",
        "version": "payment-service:stable",
        "settings": {
          "image": "payment-service:stable"
        }
      }
    ],
    "metadata": {
      "version": "cluster-v1",
      "settings": {}
    }
  }
}

注意:示例中metadata对象因为settings里没有image字段,所以version值保持不变。

关键特性

  • 递归遍历:自动处理任意层级的嵌套对象和数组
  • 条件过滤:只替换同时存在version、settings及settings.image的对象
  • 格式保留:原JSON的结构、字段顺序都会完整保留

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 10:55:07