如何将顶层Schedules属性值合并到Servers数组的每个项中?
用JQ合并顶层默认配置与服务器项内的自定义配置
需求说明
现有一份JSON配置,其中顶层的"Schedules"作为"Servers"数组中每个服务器项的默认调度配置,服务器项内的"Schedules"会覆盖默认配置的对应字段。需要将顶层默认配置与每个服务器项的自定义配置合并,用合并后的结果替换项内的"Schedules"。
示例输入JSON
{ "Schedules": { "Days": [ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" ], "Times": ["8:00 AM", "9:00 AM", "10:00 AM"] }, "Servers": [ { "Name": "Test", "Schedules": { "Days": [ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" ], "Times": [ "8:30 AM", "1:30 PM", "5:00 PM" ] } }, { "Name": "Staging", "Schedules": { "Times": [ "5:00 PM" ] } } ] }
尝试的无效命令
jq '.Servers |= map(. + {"Schedules": .Schedules})'
该命令中引用的.Schedules是服务器项内的字段,而非顶层的默认配置,因此无法实现合并效果。
期望输出结果
[ { "Name": "Test", "Schedules": { "Days": [ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" ], "Times": [ "8:30 AM", "1:30 PM", "5:00 PM" ] } }, { "Name": "Staging", "Schedules": { "Days": [ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" ], "Times": [ "5:00 PM" ] } } ]
正确的JQ命令
jq '($default = .Schedules) | .Servers |= map(.Schedules = $default + .Schedules)' input.json
命令解释
($default = .Schedules):先将顶层的默认Schedules配置存入变量$default,方便后续引用。.Servers |= map(...):对Servers数组进行遍历处理。.Schedules = $default + .Schedules:将当前服务器项的Schedules替换为默认配置与自身配置的合并结果——JQ中对象合并时,后面的对象(项内自定义配置)会覆盖前面对象(默认配置)的同名字段,正好符合需求。
内容的提问来源于stack exchange,提问作者eSPiYa
相关产品推荐
相关产品推荐

