如何用jq合并存在共同键的两个JSON对象
合并两个带共同键的JSON对象(Bash变量存储)
在Bash环境中处理JSON对象合并,推荐使用jq工具(CI环境可通过包管理器快速安装,如Ubuntu执行apt-get install jq)。针对你无法预知共同键的场景,以下是自动合并共同顶层键对应子对象的方案:
假设变量定义
jsonA='{ "extensions": { "app_name": "extensions-prod" }, "plugins": { "app_name": "plugins-prod" } }' jsonB='{ "plugins": { "project_name": "plugins-prod" } }'
仅保留共同键并合并子对象
执行以下命令,会自动识别两个JSON的共同顶层键,合并对应子对象,最终只输出这些合并后的键:
jq -n --argjson a "$jsonA" --argjson b "$jsonB" ' ($a | keys) as $akeys | ($b | keys) as $bkeys | $akeys - ($akeys - $bkeys) as $commonKeys | reduce $commonKeys[] as $k ({}; .[$k] = $a[$k] + $b[$k]) '
输出结果:
{ "plugins": { "app_name": "plugins-prod", "project_name": "plugins-prod" } }
保留所有顶层键(含非共同键)
如果需要保留两个对象中所有顶层键,仅对共同键的子对象进行合并,可使用以下命令:
jq -n --argjson a "$jsonA" --argjson b "$jsonB" ' ($a | keys) as $akeys | ($b | keys) as $bkeys | ($akeys - $bkeys) as $aOnlyKeys | ($bkeys - $akeys) as $bOnlyKeys | ($akeys - ($akeys - $bkeys)) as $commonKeys | reduce $aOnlyKeys[] as $k ({}; .[$k] = $a[$k]) | reduce $bOnlyKeys[] as $k (.; .[$k] = $b[$k]) | reduce $commonKeys[] as $k (.; .[$k] = $a[$k] + $b[$k]) '
输出结果:
{ "extensions": { "app_name": "extensions-prod" }, "plugins": { "app_name": "plugins-prod", "project_name": "plugins-prod" } }
内容的提问来源于stack exchange,提问作者puter
相关产品推荐
相关产品推荐

