如何使用jq合并嵌套JSON对象?求通用解决方案
使用jq合并多层级重复JSON对象并拼接数组
需求说明
有一批JSON对象,任意层级的键都可能重复,需要将这些对象合并为一个:相同路径下的数组要拼接合并,非数组类型的重复键则保留最后出现的值。示例输入如下:
{ "Datacenter1": { "prd1": [ "clone" ] } } { "Datacenter1": { "prd1": [ "rrr" ] } } { "BackupSite": { "prd2": [ "vol2" ] } }
期望得到的合并结果:
{ "Datacenter1": { "prd1": [ "clone", "rrr" ] }, "BackupSite": { "prd2": [ "vol2" ] } }
通用jq命令解决方案
执行以下jq命令即可实现任意深度的对象合并与数组拼接:
jq -n 'reduce inputs as $in ({}; reduce paths($in) as $path (.; $in|getpath($path) as $val; setpath($path; if ($val | type) == "array" then (getpath($path) // []) + $val else $val end ) ))'
命令逻辑拆解
- 外层遍历所有输入对象:
reduce inputs as $in ({}; ...)从空对象开始,逐个处理每个输入的JSON对象。 - 遍历当前对象的所有路径:
reduce paths($in) as $path (.; ...)拿到当前输入对象中每个键的完整层级路径(比如["Datacenter1", "prd1"])。 - 按类型处理合并逻辑:
- 如果当前路径对应的值是数组,就把目标对象中该路径已有的数组(不存在则用空数组兜底)和输入的数组拼接。
- 如果是非数组类型,直接用输入对象的值覆盖目标对象中对应路径的值(处理非数组重复键的场景)。
内容的提问来源于stack exchange,提问作者Haim Marko
相关产品推荐
相关产品推荐

