如何使用jq或任何工具合并两个JSON文件?



我有2个json文件,并希望将它们合并为一个文件。这里是文件的内容:

a.json:

{
"config":
{
"config1":
{
"config11":
{
"apple":"apple",
"orange":"orange",
"lemon":[
"lemon1",
"lemon2",
"lemon3"
],
"pear":"pear"
}
},
"config2":
{
"config21":"hello",
"config22":"goodbye"
}
}
}

b.json:

{
"config":
{
"config1":
{
"config11":
{
"apple":null,
"orange":null,
"lemon":[
"lemon4",
"lemon5",
"lemon6"
],
"pear":null
}
},
"config2":
{
"config21":"hey",
"config22":null
}
}
}

我想把b.json的非空部分合并到a.json

预期结果:

{
"config":
{
"config1":
{
"config11":
{
"apple":"apple",
"orange":"orange",
"lemon":[
"lemon4",
"lemon5",
"lemon6"
],
"pear":"pear"
}
},
"config2":
{
"config21":"hey",
"config22":"goodbye"
}
}
}

我尝试这个命令:

jq -s '.[0] + .[1]' a.json b.json

但是输出不是I want

我读了https://stedolan.github.io/jq/manual,但我仍然不知道该怎么做

帮助吗?谢谢你。

:

aa.json

{
"config": {
"config_again": {
"country": {
"countrylist": [
"CANADA",
"MEXICO",
"USA"
]
},
"language": {
"languageorderlist": [
"en_US",
"hu_HU",
"in_ID",
"it_IT",
"iw_IL",
"zh_CN"
]
},
"video": {
"mp4": "1",
"mkv": "1"
},
"Audio": {
"audio_audio": "0x111111"
}
}
}
}

bb.json:

{
"config": {
"config_again": {
"country": {
"countrylist": [
"USA"
]
},
"language": {
"languageorderlist": [
"en_US",
"de_DE"
]
},
"video": {
"mp4": null,
"mkv": null
},
"Audio": {
"audio_audio": "0x666666"
}
}
}
}

一个简单的解决方案的关键是使用paths,getpathsetpath,例如:

调用

jq -f program.jq --argfile b b.json a.json

program.jq

reduce ($b | paths(scalars)) as $p (.;
($b|getpath($p)) as $v
| if $v != null then setpath($p; $v) else . end)

在命令行中递归合并JSON文件

deepmerge.jq:

def deepmerge(a;b):                                                                                                                                                  
reduce b[] as $item (a; 
reduce ($item | keys_unsorted[]) as $key (.; 
$item[$key] as $val | ($val | type) as $type | .[$key] = if ($type == "object") then
deepmerge({}; [if .[$key] == null then {} else .[$key] end, $val])
elif ($type == "null") then
.[$key]
else
$val
end)
);   
deepmerge({}; .)
jq -f deepmerge.jq -s aa.json bb.json

最新更新