如何使用jq将defaults.json新增配置同步到current.json且不覆盖CurrentValue
问题根因
你之前执行jq -rs 'add'没达到预期,核心是两个逻辑错配:
- 该命令的合并规则是顶层键的浅覆盖:按输入顺序,后传入的
current.json会用自身的顶层键值,完全覆盖前序传入的defaults.json的同层级内容 - 你的配置体系是用每个配置对象内的
AttributeName字段做唯一标识的,不是靠顶层平级键做匹配的,通用的对象合并逻辑根本识别不到defaults里新增的setting2项
实现方法
我们需要以AttributeName为匹配键,按以下规则做合并:
- 对
current.json里已经存在的配置项,完整保留其全部内容,绝对不覆盖已经设置的CurrentValue字段 - 对
defaults.json里存在、但current.json里没有的新增配置项,直接完整补入结果集 - 自动给新增的配置项补上和
DefaultValue一致的CurrentValue初始值,避免字段缺失
对应的jq执行命令如下:
jq -s ' # 把current.json的内容转成按AttributeName做键的查找映射 (.[1] | map({(.AttributeName): .}) | add) as $currentLookup # 遍历defaults里的全量配置项逐一对齐 | .[0] | map( # 优先取current里已有的完整配置;无匹配时取defaults的配置,自动补初始CurrentValue $currentLookup[.AttributeName] // (. + {CurrentValue: .DefaultValue}) ) ' defaults.json current.json
实际效果对照
举个典型场景的执行结果:
- 初始
defaults.json包含setting1、setting2两个配置项 - 初始
current.json只包含setting1,且用户手动把setting1的CurrentValue改成了Disabled - 执行上述命令后输出的结果会满足:
- 完整保留
setting1的所有字段,包括用户自定义的CurrentValue: "Disabled",不会被defaults里的默认配置覆盖 - 自动补入
setting2的完整结构,自动带上和DefaultValue一致的CurrentValue初始值
- 完整保留
注意:该命令不会删除
current.json里存在、但defaults.json里已经移除的旧配置项,如果需要同步清理这类无效配置,可以在最后加一步,按defaults的AttributeName列表做过滤即可。
内容的提问来源于stack exchange,提问作者Arrrow
相关产品推荐
相关产品推荐

