使用jq合并两个JSON对象

6

我有两个 JSON 文件,每个文件都包含一个简单的对象,例如:

file1

{
    "key1": "value1",
    "key2": "value2"
}

文件2

{
    "key1": "valueA",
    "key3": "valueB"
}

我需要使用 jq 将这两个对象合并,以便最终得到一个包含两个对象所有键的对象。如果有重复的键,则需要使用第二个对象中的值。
我正在努力找到正确的表达式来使用。我认为应该像下面这样简单:
jq '. * .' file1 file2

应该给我想要的东西,但这会导致非json输出:
{
    "key1": "value1",
    "key2": "value2"
}
{
    "key1": "valueA",
    "key3": "valueB"
}

如果我使用jq '. + .' file1 file2,也会发生完全相同的事情。如何将这两个对象组合起来?
3个回答

11

通过传入多个输入文件,每个文件的内容都会被流式传输。您需要将它们全部读入或组合每个输入。

$ jq -s 'add' file1 file2
或者
$ jq -n 'reduce inputs as $i ({}; . + $i)' file1 file2

或者,如果您想合并而不是添加。

$ jq -n 'reduce inputs as $i ({}; . * $i)' file1 file2

啊!就是这个,非常感谢。合并时,第二个的值会覆盖第一个的值还是相反? - Aleks G
我相信第二个优先级更高。合并对于深度嵌套的对象非常有用。但是你的输入似乎很浅。 - Jeff Mercado
正确,浅显易懂的输入。再次感谢。 - Aleks G
嗯...有趣。我尝试使用最后一个选项。在我的MacOS上运行良好,但在Linux上失败了:error: inputs is not defined <newline> reduce inputs as $i ({}; . * $i) 1 compile error - Aleks G
你应该努力获得至少1.5版本。有很多功能可以使jq更加实用和可扩展。如果你的发行版没有提供,就要自己构建或获取二进制文件。 - Jeff Mercado
显示剩余2条评论

2

使用 jq--slurpfile 选项的替代方式:

jq --slurpfile f2 file2 '. + $f2[0]' file1

输出结果:

{
  "key1": "valueA",
  "key2": "value2",
  "key3": "valueB"
}

2
这里有另一种方法(假设示例数据在file1.jsonfile2.json中):
$ jq -Mn --argfile file1 file1.json --argfile file2 file2.json '$file1 + $file2'
{
  "key1": "valueA",
  "key2": "value2",
  "key3": "valueB"
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接