我有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
,getpath
和setpath
,例如:
调用
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
是