json - 使用 jq 合并 2 个 JSON 对象

标签 json bash merge key jq

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

{
  "Parameters: {
     "a": "value-of-a",
     "b": "value-of-b"
  }
}
V2是
{
  "Parameters": {
     "a": "new-value-of-a",
     "c": "value-of-c"
  }
}
我想用 V2 的值覆盖 V1 的值。我想生成一个新的 JSON,如下所示:
预期
{
   "Parameters": {
      "a": "new-value-of-a",
      "b": "value-of-b"
   }
}
我尝试了以下方法:
(
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)'
)

但这会产生
实际
{
   "Parameters": {
      "a": "new-value-of-a",
      "b": "value-of-b",
      "c": "value-of-c"
   }
}
问题是我不希望 V1 中不存在的 V2 中的节点出现在结果中。谁能帮我?

最佳答案

这是一个概念上简单且可扩展的无减少解决方案:

jq -n '
   # Emit the object with key-value pairs of $o2 
   # for keys that appear in both . and $o2
   def commonKeys($o2):
     keys_unsorted as $k1
     | ($o2|keys_unsorted) as $k2
     | [($k1 - ($k1-$k2))[] | {(.): $o2[.]}] | add
   ;
   input.Parameters as $dict
   | input
   | .Parameters |= (. + commonKeys($dict))

' v2.json v1.json 

关于json - 使用 jq 合并 2 个 JSON 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64052172/

相关文章:

java - 根据属性将某些属性从 1 个列表复制到另一个列表(不同的属性合并)

git - 如何删除 git MERGE_MSG?

git - 如何将多个远程 git 存储库包含到一个存储库中?

python - 如何通过YouTube JSON响应有效地分页?

c - 尝试编译 C 文件时出错 : mkfifo: cannot create fifo 'stderr' : Operation not supported

PHP exec() 没有从 bash 命令获取输出

bash - 正则表达式解析字符串以提取shell脚本中的数字

jquery - 跟踪用户输入的页面

json - json 的紧凑二进制表示

javascript - 使用 JSON.parse 评估 Javascript 数据结构时出错