使用bash+jq合并两个JSON指定内容时遇异常问题求助
JSON节点合并脚本问题修复
问题概述
有两个JSON文件common.json和pi.json,需要合并两者的common、east节点生成新JSON文件,但现有bash脚本输出不符合预期,存在两个问题:
common.json的内容未被提取到结果中App-Env的值不符合期望(原脚本输出为my-pi,期望为1713311902,与SentinelValue值一致)
文件内容
common.json
{ "common": { "Hello": "ABC" }, "east": { "Direction": "East" }, "west": { "Direction": "West" } }
pi.json
{ "common": { "MyUri": "www.myuri.com" }, "east": { "App-Env": "my-pi", "SentinelValue": 1713311902 }, "west": { "App-Env": "my-piw", "SentinelValue": 1713311902 } }
现有脚本
jq_input_files=("common.json" "pi.json") jq --slurp 'map({ ((.common | keys_unsorted[])): .common[], ((.east | keys_unsorted[])): .east[] }) | add' "${jq_input_files[@]}" > "test.json"
错误输出
{ "MyUri": "www.myuri.com", "App-Env": "my-pi", "SentinelValue": 1713311902 }
期望输出
{ "MyUri": "www.myuri.com", "App-Env": 1713311902, "SentinelValue": 1713311902, "Hello": "ABC", "Direction": "East" }
问题分析
- common.json内容未被提取:原脚本中
map内部的对象构造逻辑错误,使用keys_unsorted[]和.[]展开键值对时,会生成多个独立对象而非单个包含所有键值对的对象,后续add操作无法正确合并前序文件的内容。正确逻辑应为先将每个文件的common和east节点合并为单个对象,再合并所有文件的结果。 - App-Env值不符合期望:原脚本直接保留
pi.json中App-Env的原始值,未按需求将其替换为同节点下SentinelValue的值,需添加字段替换逻辑。
修复方案
- 对每个输入文件,先合并其
common和east节点为单个对象:.common + .east - 检测并替换
App-Env字段值:若对象存在App-Env,则将其值设为SentinelValue的值 - 合并所有处理后的对象,保留所有键值对
最终脚本
jq_input_files=("common.json" "pi.json") jq --slurp ' map( .common + .east | if .["App-Env"] then .["App-Env"] = .SentinelValue else . end ) | add' "${jq_input_files[@]}" > "test.json"
验证结果
运行上述脚本后,test.json内容与期望输出一致(JSON键顺序不影响语义,若需指定顺序可额外添加键排序逻辑):
{ "Hello": "ABC", "Direction": "East", "MyUri": "www.myuri.com", "App-Env": 1713311902, "SentinelValue": 1713311902 }
内容的提问来源于stack exchange,提问作者JS noob
相关产品推荐
相关产品推荐

