如何使用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
相关产品推荐
相关产品推荐

