You need to enable JavaScript to run this app. 如何使用jq将defaults.json新增配置同步到current.json且不覆盖CurrentValue
优惠活动
大模型
产品
解决方案
定价
更多

如何使用jq将defaults.json新增配置同步到current.json且不覆盖CurrentValue

问题根因

你之前执行jq -rs 'add'没达到预期,核心是两个逻辑错配:

  • 该命令的合并规则是顶层键的浅覆盖:按输入顺序,后传入的current.json会用自身的顶层键值,完全覆盖前序传入的defaults.json的同层级内容
  • 你的配置体系是用每个配置对象内的AttributeName字段做唯一标识的,不是靠顶层平级键做匹配的,通用的对象合并逻辑根本识别不到defaults里新增的setting2项

实现方法

我们需要以AttributeName为匹配键,按以下规则做合并:

  1. 对current.json里已经存在的配置项,完整保留其全部内容,绝对不覆盖已经设置的CurrentValue字段
  2. 对defaults.json里存在、但current.json里没有的新增配置项,直接完整补入结果集
  3. 自动给新增的配置项补上和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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.02 10:06:04