合并JSON数组

时间:2017-02-02 19:48:52

标签: arrays json bash jq

所以我的目标是合并json文件获取这种格式:

{
  "title": "NamesBook",
  "list": [
    {
      "name": "Ajay"
    },
    {
      "name": "Al"
    }
  ]
}

我的文件看起来像这种格式:

blahblah.json

{
  "title": "NamesBook",
  "list": [
    {
      "name": "Ajay"
    }
  ]
}

blueblue.json

{
  "title": "NamesBook",
  "list": [
    {
      "name": "Al"
    }
  ]
}

我可以将所有名字的列表数组存储在变量中,其中包含以下内容:

x = jq -s '.[].list' *.json

然后我计划将变量附加到我创建的文件out_json中的空数组中,如下所示:

{
  "type": "NamesBook",
  "list": []
}

然而,当我的脚本在线上运行时

jq '.list[] += "$x"' out.json'

它会出现jq错误:

  

无法迭代null。

即使添加随机元素,也会出现相同的错误。关于我应该如何进行的提示? jq中还有其他工具可以帮助实现合并数组吗?

4 个答案:

答案 0 :(得分:7)

您可以将文件与添加(jq 1.3 +)合并:

jq -s '.[0].list=[.[].list|add]|.[0]' *.json

展平(jq 1.5 +):

jq -s '.[0].list=([.[].list]|flatten)|.[0]' *.json

[.[].list] - 创建一个包含所有" list"的数组。阵列

 [
  [
    {
      "name": "Ajay"
    }
  ],
  [
    {
      "name": "Al"
    }
  ]
]

[.[].list]|flatten - 展平它(或.[].list|add - 将所有数组添加

[
  {
    "name": "Ajay"
  },
  {
    "name": "Al"
  }
]

.[0].list=([.[].list]|flatten)|.[0] - 替换第一个"列表"合并后,输出它。

{
  "title": "NamesBook",
  "list": [
    {
      "name": "Ajay"
    },
    {
      "name": "Al"
    }
  ]
}

答案 1 :(得分:6)

假设每个文件都具有相同的title并且您只是简单地组合了list内容,那么您可以这样做:

$ jq 'reduce inputs as $i (.; .list += $i.list)' blahblah.json blueblue.json

这只取第一项并将其添加到其列表中,列出所有其他输入。

答案 2 :(得分:3)

让我也提供标题要求的内容,因为我敢肯定很多关注此问题的人都在寻找更简单的东西:

echo -e '["a","b"]\n["c","d"]' | jq '.[]' | jq -s

[
“ a”,
“ b”,
“ c”,
“ d”
]

注意:上面的代码同样适用于对象数组

答案 3 :(得分:1)

OP没有具体说明如果有.title不是" NamesBook"的对象会发生什么。如果目的是选择.title等于" NamesBook"的对象,可以写:

map(select(.title == "NamesBook"))
| {title: .[0].title, list: map( .list ) | add}

这假设使用-s选项调用jq。

顺便说一句,add是这里的方式:简单快捷。