我想转换对象流:
{
"a": "green",
"b": "white"
}
{
"a": "red",
"c": "purple"
}
成一个对象:
{
"a": "red",
"b": "white",
"c": "purple"
}
另外,如何将相同的序列包装到数组中?
[
{
"a": "green",
"b": "white"
},
{
"a": "red",
"c": "purple"
}
]
可悲的是,手册严重缺乏全面性,谷歌搜索也没有找到答案。
答案 0 :(得分:50)
如果你的输入是一个对象流,那么除非你的jq有inputs
,否则这些对象必须是" slurped"使用-s命令行选项,以便将它们组合在一起。
因此,在输入流中组合对象的一种方法是使用:
jq -s add
对于第二个问题,创建一个数组:
jq -s .
当然还有其他选择,但这些都很简单,不需要最新版本的jq。使用jq 1.5及更高版本,您可以使用'输入' jq -n '[inputs]'
答案 1 :(得分:4)
使用-s命令行选项进行slurping的替代方法是使用inputs
过滤器。像这样:
jq -n '[inputs] | add'
这将生成一个包含所有输入对象的对象。
答案 2 :(得分:2)
要将对象组合成数组,可以使用以下命令:
$ echo '
{
"a": "green",
"b": "white"
}
{
"a": "red",
"c": "purple"
}' | jq -n '[inputs]'
[
{
"a": "green",
"b": "white"
},
{
"a": "red",
"c": "purple"
}
]
答案 3 :(得分:2)
如果您通过 jq 过滤器而不是外部输入达到这一点,mwag's comment 建议将您的 jq 过滤器包装在 []
中可能会有用。
示例:
$ echo '[{"foo":42},{"foo":43}]' | jq '.[]'
{
"foo": 42
}
{
"foo": 43
}
$ echo '[{"foo":42},{"foo":43}]' | jq '[.[]]'
[
{
"foo": 42
},
{
"foo": 43
}
]