如何将jq中的对象序列组合成一个对象?

Jen*_* M. 45 arrays json addition fileslurp jq

我想转换对象流:

{
  "a": "green",
  "b": "white"
}
{
  "a": "red",
  "c": "purple"
}
Run Code Online (Sandbox Code Playgroud)

成为一个对象:

{
  "a": "red",
  "b": "white",
  "c": "purple"
}
Run Code Online (Sandbox Code Playgroud)

另外,如何将相同的序列包装到数组中?

[
    {
      "a": "green",
      "b": "white"
    },
    {
      "a": "red",
      "c": "purple"
    }
]
Run Code Online (Sandbox Code Playgroud)

可悲的是,手册严重缺乏全面性,谷歌搜索也没有找到答案.

pea*_*eak 61

如果您的输入是一个对象流,那么除非您的jq具有inputs,否则必须"slurped"对象,例如使用-s命令行选项,以便将它们组合在一起.

因此,在输入流中组合对象的一种方法是使用:

jq -s add
Run Code Online (Sandbox Code Playgroud)

对于第二个问题,创建一个数组:

jq -s .
Run Code Online (Sandbox Code Playgroud)

当然还有其他选择,但这些都很简单,不需要最新版本的jq.使用jq 1.5及更高版本,您可以使用"输入",例如jq -n '[inputs]'

  • @JenniferM.而不是留下*Thanks*评论你也可以[接受答案](http://stackoverflow.com/help/someone-answers) (7认同)
  • 好吧,我只需要发布它来弄清楚如何去做.我转过身来.[] | <表达> | 加入`.| map(<expression>)| 添加`现在它做我想要的;) (5认同)
  • 当序列作为表达式的结果显示时怎么样?as `&lt;jq 表达式&gt; | add` 并没有完全达到我想要的效果.. (2认同)

Evg*_*eny 15

使用-s命令行选项进行替代的替代方法是使用inputs过滤器。像这样:

jq -n '[inputs] | add'
Run Code Online (Sandbox Code Playgroud)

这将产生一个包含所有输入对象的对象。


ggo*_*len 10

如果您通过 jq 过滤器而不是外部输入到达这一点,mwag 的评论建议将 jq 过滤器包装在[]s 中可能会很有用。

例子:

$ echo '[{"foo":42},{"foo":43}]' | jq '.[]'
{
  "foo": 42
}
{
  "foo": 43
}
$ echo '[{"foo":42},{"foo":43}]' | jq '[.[]]'
[
  {
    "foo": 42
  },
  {
    "foo": 43
  }
]
Run Code Online (Sandbox Code Playgroud)

另请参阅jq Github 问题 #684:从对象创建数组?


Tra*_*991 5

要将对象组合到数组中,您可以使用以下命令:

$ echo '
{
  "a": "green",
  "b": "white"
}
{
  "a": "red",
  "c": "purple"
}' | jq -n '[inputs]'
[
  {
    "a": "green",
    "b": "white"
  },
  {
    "a": "red",
    "c": "purple"
  }
]
Run Code Online (Sandbox Code Playgroud)