使用 jq 合并 2 个 JSON 对象

Joh*_*y I 5 bash merge json key jq

我在 2 个变量 V1 和 V2 中有 2 个 json 对象。

V1 是

{
  "Parameters: {
     "a": "value-of-a",
     "b": "value-of-b"
  }
}
Run Code Online (Sandbox Code Playgroud)

V2是

{
  "Parameters": {
     "a": "new-value-of-a",
     "c": "value-of-c"
  }
}
Run Code Online (Sandbox Code Playgroud)

我想用 V2 的值覆盖 V1 的值。我想生成一个新的 JSON,如下所示:

预期的

{
   "Parameters": {
      "a": "new-value-of-a",
      "b": "value-of-b"
   }
}
Run Code Online (Sandbox Code Playgroud)

我尝试了以下方法:

(
echo '{ "Parameters": { "a": "value-of-a", "b": "value-of-b" } }'\
'{ "Parameters": { "a": "new-value-of-a", "c": "value-of-c" } }'\
| jq --slurp 'reduce .[] as $item ({}; . * $item)'
)

Run Code Online (Sandbox Code Playgroud)

但这会产生

实际的

{
   "Parameters": {
      "a": "new-value-of-a",
      "b": "value-of-b",
      "c": "value-of-c"
   }
}
Run Code Online (Sandbox Code Playgroud)

问题是我不希望 V1 中不存在的 V2 中的节点出现在结果中。谁能帮我?

And*_*rov 1

如果$.Parameter对象像您的示例一样简单

jq \
 --argjson a '{ "Parameters": { "a": "value-of-a", "b": "value-of-b" } }' \
 --argjson b '{ "Parameters": { "a": "new-value-of-a", "c": "value-of-c" } }' \
 -n '
   $a | .Parameters | keys_unsorted as $whitelist 
 | $b | .Parameters | with_entries( select(.key | IN($whitelist[])) ) as $update
 | $a | .Parameters += $update '

Run Code Online (Sandbox Code Playgroud)

如果您有两个文件,您可以(例如)使用input两次而不是--argjson.