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

如何使用Jq合并两个JSON参数文件并实现同名键覆盖去重

使用Jq合并key=value格式JSON数组的方案

你的需求核心是合并两个存储key=value字符串的JSON数组,规则为保留所有唯一配置,同名配置以第二个文件的值为准。之前的命令无法生效,是因为数组元素是普通字符串,jq不会自动识别=作为键分隔符做对象级合并。

可直接使用的命令

jq -s '
flatten
| map(split("=") | {(.[0]): .[1]})
| add
| to_entries | map("\(.key)=\(.value)")
' param1.json param2.json

如果需要一行执行可以用简写版本:

jq -s 'flatten|map(split("=")|{(.[0]):.[1]})|add|to_entries|map("\(.key)=\(.value)")' param1.json param2.json

逻辑说明

  • -s(slurp模式):将两个输入文件的内容读取到同一个数组中,方便统一处理
  • flatten:把两层嵌套的数组(两个文件各自的数组)拍平为单层字符串数组,顺序为param1的所有元素在前,param2的所有元素在后
  • map(split("=") | {(.[0]): .[1]}):遍历每个配置字符串,按=切分后转为单键值对象,例如"age=40"会转为{"age": "40"}
  • add:将所有单键对象合并为一个总对象,由于param2的配置项排在后面,同名键会自动覆盖param1的旧值,正好满足第二个文件优先级更高的要求
  • to_entries | map("\(.key)=\(.value)"):将合并完成的对象重新转换为key=value格式的字符串数组,输出格式和预期完全匹配

执行结果

运行上述命令后会输出你期望的结果:

[
  "name=xyz",
  "age=42",
  "email=qqqq",
  "drivingLicense=2761"
]

之前尝试的命令问题说明

  • jq -s '.[0] + .[1]':仅做简单的数组拼接,没有任何去重、同键覆盖逻辑,必然会保留重复配置项
  • jq '. * input':该语法用于合并两个JSON对象,而你的输入是数组类型,直接使用无法得到正确结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 10:36:16