使用 JQ 将一个 JSON 文件的值更新为另一个 JSON 的值

Update one JSON file values with values from another JSON using JQ

所以我有两个 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 获得预期的结果? 顺便说一句,我不能使用密钥的值进行更新,因为在其他排列中我会得到意想不到的结果...

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 - 仅更新 模型 的匹配键
  • 的值

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

假设文件 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] ... 不同。