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

主宰稳场 提交于 2019-12-02 08:49:11

问题


So I have two JSON files:

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

and I want to update the model.json file with the bosh.json file so it looks like this:

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

I tried this:

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

but I get too many keys

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

and

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

yeilds the same...

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

while this

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

yields the incorrect keys...

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

Does anyone have any ideas how to get the expected results using jq? by the way, I cannot use the value of the key for the updates, as i will have unexpected results in other permutations...


回答1:


The requirements are not completely clear, but here's the solution to one interpretation. This solution can easily be modified to match the other obvious interpretation.

Assuming the file bosh.jq contains the following jq program:

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

then the command:

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

will in effect emit the edited version of model.json.

Using with_entries

If you prefer a reduce-free approach, consider:

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

Note that if $bosh|has($k) ... is NOT the same as if $bosh[$k] ....




回答2:


jq solution:

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

The output:

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

  • if $bosh[.key] then .value = $bosh[.key] else . end - update model's value only for matched keys


来源:https://stackoverflow.com/questions/44855206/update-one-json-file-values-with-values-from-another-json-using-jq

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!