如何使用jq深度合并两个JSON文件并拼接数组
用jq合并多个JSON文件并拼接嵌套数组
输入文件内容
a.json
{"key1": { "key2": [ 1, 2 ] }, "key3": "aaa" }
b.json
{"key1": { "key2": [ 3, 4, 5 ] }, "key4": "bbb" }
预期结果
{"key1": { "key2": [ 1, 2, 3, 4, 5 ] }, "key3": "aaa", "key4": "bbb" }
实现命令
要实现嵌套数组拼接、顶层键合并的效果,可以用jq自定义递归合并逻辑,执行以下命令:
jq -s ' def deep_merge($other): reduce $other[] as $item (.; reduce ($item | keys_unsorted[]) as $key (.; if .[$key] == null then .[$key] = $item[$key] elif type == $item[$key] | type then if .[$key] | type == "array" then .[$key] += $item[$key] elif .[$key] | type == "object" then .[$key] |= deep_merge([$item[$key]]) else .[$key] = $item[$key] end else .[$key] = $item[$key] end ) ); deep_merge(.) ' a.json b.json
命令解释
-s:将所有输入的JSON文件读取为一个数组,方便遍历处理deep_merge自定义函数:- 遍历每个输入的JSON对象,逐个合并到初始空对象
- 对每个键做针对性处理:
- 目标对象无此键时,直接赋值
- 键值类型相同时:
- 数组类型:用
+=拼接两个数组 - 对象类型:递归调用
deep_merge处理嵌套对象 - 其他类型:直接覆盖(适配场景中唯一值的需求)
- 数组类型:用
- 类型不同时直接覆盖
简化版(仅适配当前固定结构)
如果只需要处理key1.key2这一个数组的拼接,也可以用更简洁的命令:
jq -s '.[0] * .[1] | .key1.key2 = .[0].key1.key2 + .[1].key1.key2' a.json b.json
该命令先合并两个对象(默认数组会被覆盖),再手动拼接目标数组并赋值,适合结构固定的简单场景。
内容的提问来源于stack exchange,提问作者tokugawa
相关产品推荐
相关产品推荐

