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

使用JQ使用另一个JSON的值更新一个JSON文件值,json,merge,updates,jq,Json,Merge,Updates,Jq,所以我有两个JSON文件: bosh.json: { "key_pair_name": "my-aws-keypair", "ssh_private_key": "my-key-name", "trusted_certificates": "my-trusted-certs" } { "trusted_certificates": "vault-supplied-value", "vm_password_type": "generate" } model.json: {

所以我有两个JSON文件:

bosh.json:

{
  "key_pair_name": "my-aws-keypair",
  "ssh_private_key": "my-key-name",
  "trusted_certificates": "my-trusted-certs"
}
{
  "trusted_certificates": "vault-supplied-value",
  "vm_password_type": "generate"
}
model.json:

{
  "key_pair_name": "my-aws-keypair",
  "ssh_private_key": "my-key-name",
  "trusted_certificates": "my-trusted-certs"
}
{
  "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"
}

也一样

{
  "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"
}

  • 如果$bosh[.key],那么.value=$bosh[.key]else。结束
    -仅更新匹配键的模型值

要求并不完全清楚,但这里有一种解释的解决方案。这个解决方案可以很容易地修改,以匹配其他明显的解释

假设文件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(.key as $k | if $bosh|has($k) then .value = $bosh[$k] else . end )

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

@RomanPerekgrest-这应该是:带有_条目(.key as$k | if$bosh | has($k)then.value=$bosh[$k]else.end)谢谢@peak。这两种解决方案都能很好地工作。在输入(都是JSON)的情况下,应该修改什么?