我有多个JSON文件,我想合并为一个。 有些人具有相同的根元素,但有不同的孩子。我不想覆盖子项,但如果它们具有相同的父元素,则也会扩展它们。 我已经尝试了this answer,但它不起作用:
jq: error (at file2.json:0): array ([{"title":"...) and array ([{"title":"...) cannot be multiplied
Sample files and wanted result (Gist)
提前谢谢。
答案 0 :(得分:1)
这是一个使用group_by(.key)
来决定的递归解决方案
要结合的对象。如果.children
这可能会更简单一点
更均匀。有时它在样本数据中不存在,有时会出现异常值[{}]
。
def merge:
def kids:
map(
.children
| if length<1 then empty else .[] end
)
| if length<1 then {} else {children:merge} end
;
def mergegroup:
{
title: .[0].title
, key: .[0].key
} + kids
;
if .==[{}] then .
else group_by(.key) | map(mergegroup)
end
;
[ .[] | .[] ] | merge
使用-s
选项运行时如下
jq -M -s -f filter.jq file1.json file2.json
它产生以下输出。
[
{
"title": "Title1",
"key": "12345678",
"children": [
{
"title": "SubTitle2",
"key": "123456713",
"children": [
{}
]
},
{
"title": "SubTitle1",
"key": "12345679",
"children": [
{
"title": "SubSubTitle1",
"key": "12345610"
},
{
"title": "SubSubTitle2",
"key": "12345611"
},
{
"title": "DifferentSubSubTitle1",
"key": "12345612"
}
]
}
]
}
]
如果.children
内的对象排序很重要
然后可以将sort_by
添加到{children:merge}
表达式中,
例如{children:merge|sort_by(.key)}
答案 1 :(得分:0)
以下内容可以重现您想要的结果。它绝不是自动的,它在这个阶段确实是一个概念证明。
一个班轮:
jq -s '. as $in | ($in[0][].children[].children + $in[1][].children[0].children | unique) as $a1 | $in[1][].children[1] as $s1 | $in[0] | .[0].children[0].children = ($a1) | .[0].children += [$s1]' file1.json file2.json
多行分类(复制/粘贴):
jq -s '. as $in
| ($in[0][].children[].children + $in[1][].children[0].children
| unique) as $a1
| $in[1][].children[1] as $s1
| $in[0]
| .[0].children[0].children = ($a1)
| .[0].children += [$s1]' file1.json file2.json
其中:
$in
:file1.json和file2.json合并输入$a1
:合并&#34; SubSubTitle&#34;阵列$s1
:第二个字幕对象我怀疑this无效的原因是因为您的架构不同并且嵌套了数组。
我觉得这看起来很催眠,如果你能详细说明结构的固定程度和要求是什么,那就太好了。