深JSON合并

时间:2017-05-03 15:16:55

标签: json jq

我有多个JSON文件,我想合并为一个。 有些人具有相同的根元素,但有不同的孩子。我不想覆盖子项,但如果它们具有相同的父元素,则也会扩展它们。 我已经尝试了this answer,但它不起作用:

jq: error (at file2.json:0): array ([{"title":"...) and array ([{"title":"...) cannot be multiplied

Sample files and wanted result (Gist)

提前谢谢。

2 个答案:

答案 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无效的原因是因为您的架构不同并且嵌套了数组。

我觉得这看起来很催眠,如果你能详细说明结构的固定程度和要求是什么,那就太好了。