我想合并两个JSON文件,其中基本文件(A)中的对象通过匹配文件(B)中的对象进行扩充,但不会覆盖A和B具有相同键的不同值的情况.
例如,我有一个JSON文件(A),其内容如下
[
{
"name": "alpha",
"value": "apple"
},
{
"name": "beta",
"value": "banana"
},
{
"name": "gamma",
"value": "guava"
}
]
第二个JSON文件(B),具有相同的基本 struct ,但可 Select 使用其他键(本例中为metadata
,但可以是任何键):
[
{
"name": "alpha",
"value": "apple",
"metadata": {
"types": [
"granny"
]
}
},
{
"name": "beta",
"value": "blueberry"
},
{
"name": "omega",
"value": "orange"
}
]
我想将这两个列表合并在一起,将B中对象的键/值添加到A中的同一对象中(与name
匹配).我的JQ实现这一点的方法如下:
jq -s '[ .[0][] as $a | .[1][] as $b | select ($a.name == $b.name) | $a * $b ]' b.json a.json
这会将metadata
加到A中,并为其他关键点保留A的值.然而,结果中缺少gamma
个.从上面的示例中,我想要一个结果,其中:
- Alpha应该有元数据
- 贝塔应该是香蕉的,而不是蓝莓的.
- 伽马应该在最终名单中
- 欧米茄不应该出现在最终名单中
- 应保持列表中对象的顺序.
我想要的是:
[
{
"name": "alpha",
"value": "apple"
"metadata": {
"types": [
"granny"
]
}
},
{
"name": "beta",
"value": "banana"
},
{
"name": "gamma",
"value": "guava"
}
]
如何调整此查询以包括来自A的顶级对象,而不包括来自B的顶级对象?