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

如何使用jq仅迁移/合并JSON指定属性,及删除指定属性?

用JQ合并指定JSON属性的解决方案

现有文件内容

a.json 和 b.json 的内容如下:

$ jq . a.json b.json 
{
  "id": "ZGVhZGJlZWY=",
  "name": "first file",
  "version": 1,
  "description": "just a simple json file"
}
{
  "version": 2,
  "name": "fake name",
  "dependencies": [
    4,
    2
  ],
  "comment": "I'm just sitting here, ignore me"
}

需求说明

以 a.json 为模板,合并 b.json 的指定属性:

  • 用 b.json 的 version 覆盖 a.json 中的对应值
  • 将 b.json 的 dependencies 新增到结果中
  • 保留 a.json 的 name 属性,不受 b.json 的同名属性影响
  • 保留 a.json 其他原有属性

正确的JQ命令

要同时处理两个JSON文件并合并指定属性,可使用以下命令:

jq -n 'input + (input | {version, dependencies})' a.json b.json

命令解释

  • -n 参数:阻止JQ自动读取并处理每个输入对象,让我们手动控制输入读取逻辑
  • input:依次读取输入文件,第一个input获取a.json的内容,第二个input获取b.json的内容
  • input | {version, dependencies}:从b.json中仅提取version和dependencies两个属性组成新对象
  • + 运算符:将a.json的完整内容与提取出的b.json属性对象合并,同名属性(仅version)会被b.json的值覆盖,其他属性保留

执行该命令后,输出结果与预期一致:

{
  "id": "ZGVhZGJlZWY=",
  "name": "first file",
  "version": 2,
  "description": "just a simple json file",
  "dependencies": [
    4,
    2
  ]
}

额外需求:删除description属性

如果需要从结果中移除description属性,只需在命令末尾添加| del(.description):

jq -n 'input + (input | {version, dependencies}) | del(.description)' a.json b.json

执行后输出:

{
  "id": "ZGVhZGJlZWY=",
  "name": "first file",
  "version": 2,
  "dependencies": [
    4,
    2
  ]
}

为什么原命令不生效

原命令 jq '. + {version, dependencies}' a.json b.json 会对每个输入文件单独处理:

  • 对a.json:尝试给它添加version和dependencies属性,但这两个属性原本不存在,结果就是a.json本身
  • 对b.json:提取自身的version和dependencies并合并,结果就是b.json的这两个属性组成的对象
    最终会输出两个独立的结果,而非合并后的单个对象,因此不符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 03:41:29