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

如何使用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

命令解释

  1. -s:将所有输入的JSON文件读取为一个数组,方便遍历处理
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 03:03:21