我有两个json文件,orig.json和patch.json,它们的格式相似。
请注意,
是否有一种简单的方法可以使用jq来实现这一点,也许通过覆盖数组的默认合并策略?
orig.json:
{
"a": {
"a1": "original a1",
"a2": "original a2",
"list": ["baz", "bar"]
},
"b": "original value B"
}
patch.json:
{
"a": {
"a1": "patch a1",
"list": ["foo"]
},
"c": "original c"
}
目前我正在使用jq
进行递归合并。但是,jq对于列表的默认行为只是重新分配。使用$ jq -s'.[0] * .[1]' orig.json patch.json
命令在jq中的示例输出:
{
"a": {
"a1": "patch a1",
"a2": "original a2",
"list": [
"foo"
]
},
"b": "original value B",
"c": "original c"
}
请注意,
a.list
现在等于patch.json的a.list
。我希望新的a.list
是orig.json的列表和patch.json的列表合并而成的。换句话说,我希望a.list
等于["baz", "bar", "foo"]
。是否有一种简单的方法可以使用jq来实现这一点,也许通过覆盖数组的默认合并策略?
$
更为简洁,我认为更易理解,这也是我提出建议的原因;如果您想使用a as $a
构造,我认为在reduce
之前执行此操作会更整洁,以便更清楚地表明该值由于某种原因被锁定。 - Parakletajq -f meld.jq 1.json 2.json ..
,其中文件meld.jq
中包含函数定义,后跟所需的调用语句(我使用reduce inputs as $i (.; meld(.; $i))
将多个JSON文件进行深度合并而不需要 slurping)...小心分号分隔参数;逗号会导致误导性错误meld/1 is not defined at <top-level>, line 16:
。 - eMPee584