【问题标题】:Update one JSON file values with values from another JSON using JQ使用 JQ 用另一个 JSON 的值更新一个 JSON 文件的值
【发布时间】:2017-06-30 21:43:49
【问题描述】:

所以我有两个 JSON 文件:

bosh.json:

{
  "key_pair_name": "my-aws-keypair",
  "ssh_private_key": "my-key-name",
  "trusted_certificates": "my-trusted-certs"
}

model.json:

{
  "trusted_certificates": "vault-supplied-value",
  "vm_password_type": "generate"
}

我想用 bosh.json 文件更新 model.json 文件,使其看起来像这样:

{
  "trusted_certificates": "my-trusted-certs",
  "vm_password_type": "generate"
}

我试过了:

jq --argfile bosh bosh.json '. += $bosh' model.json

但我得到的钥匙太多

{
  "trusted_certificates": "my-trusted-certs",
  "vm_password_type": "generate",
  "key_pair_name": "my-aws-keypair",
  "ssh_private_key": "my-key-name"
}

jq --argfile bosh bosh.json '. + $bosh' model.json

产生相同的结果...

{
  "trusted_certificates": "my-trusted-certs",
  "vm_password_type": "generate",
  "key_pair_name": "my-aws-keypair",
  "ssh_private_key": "my-key-name"
}

此时

jq --argfile bosh bosh.json '. = $bosh' model.json

产生不正确的键...

{
  "key_pair_name": "my-aws-keypair",
  "ssh_private_key": "my-key-name",
  "trusted_certificates": "my-trusted-certs"
}

有没有人知道如何使用 jq 获得预期的结果? 顺便说一句,我不能使用键的值进行更新,因为在其他排列中我会得到意想不到的结果......

【问题讨论】:

    标签: json merge updates jq


    【解决方案1】:

    要求并不完全清楚,但这是一种解释的解决方案。可以轻松修改此解决方案以匹配其他明显的解释。

    假设文件 bosh.jq 包含以下 jq 程序:

    reduce keys[] as $k (.; if $bosh|has($k) then .[$k] = $bosh[$k] else . end)
    

    然后是命令:

    jq --argfile bosh bosh.json -f bosh.jq model.json
    

    实际上会发出 model.json 的编辑版本。

    使用 with_entries

    如果您更喜欢 reduce-free 方法,请考虑:

    with_entries(.key as $k | if $bosh|has($k) then .value = $bosh[$k] else . end )
    

    请注意,if $bosh|has($k) ...if $bosh[$k] ... 不同。

    【讨论】:

    • 谢谢@peak。这两种解决方案都可以很好地工作。
    • 如果输入(都是JSON)是数组,应该修改什么?
    【解决方案2】:

    jq解决办法:

    jq --argfile bosh bosh.json 'with_entries( 
             if $bosh[.key] then .value = $bosh[.key] else . end)' model.json
    

    输出:

    {
      "trusted_certificates": "my-trusted-certs",
      "vm_password_type": "generate"
    }
    

    • if $bosh[.key] then .value = $bosh[.key] else . end - 仅为匹配的键更新 模型 的值

    【讨论】:

    • @RomanPerekgrest - 应该是:with_entries(.key as $k | if $bosh|has($k) then .value = $bosh[$k] else .end )
    猜你喜欢
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    • 2020-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多