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

问题描述 投票:0回答:5

我想转换对象流:

{
  "a": "green",
  "b": "white"
}
{
  "a": "red",
  "c": "purple"
}

变成一个物体:

{
  "a": "red",
  "b": "white",
  "c": "purple"
}

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

[
    {
      "a": "green",
      "b": "white"
    },
    {
      "a": "red",
      "c": "purple"
    }
]

遗憾的是,该手册严重缺乏全面性,谷歌也找不到答案。

arrays json addition jq fileslurp
5个回答
141
投票

如果你的输入是对象流,那么除非你的 jq 有

inputs
,否则对象必须被“slurped”,例如使用 -s 命令行选项,以便将它们组合起来。

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

jq -s add

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

jq -s .

当然还有其他替代方案,但这些都很简单,并且不需要最新版本的 jq。对于 jq 1.5 及更高版本,您可以使用“输入”,例如

jq -n '[inputs]'

高效解决方案

对于第一个问题(减少),与 slurping(无论是通过 -s 选项,还是使用

[inputs]
)相比,使用
reduce
inputs
和 -n 命令行选项会更有效。例如,要将对象流合并为单个对象:

jq -n 'reduce inputs as $in (null; . + $in)'

同样,没有

--null-input
:

jq 'reduce inputs as $in (.; . + $in)

44
投票

使用 -s 命令行选项进行吸食的另一种方法是使用

inputs
过滤器。像这样:

jq -n '[inputs] | add'

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


11
投票

如果您通过 jq 过滤器而不是外部输入达到这一点,mwag 的评论建议将 jq 过滤器包装在

[]
s 中可能会很有用。

示例:

$ echo '[{"foo":42},{"foo":43}]' | jq '.[]'
{
  "foo": 42
}
{
  "foo": 43
}
$ echo '[{"foo":42},{"foo":43}]' | jq '[.[]]'
[
  {
    "foo": 42
  },
  {
    "foo": 43
  }
]

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


8
投票

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

$ echo '
{
  "a": "green",
  "b": "white"
}
{
  "a": "red",
  "c": "purple"
}' | jq -n '[inputs]'
[
  {
    "a": "green",
    "b": "white"
  },
  {
    "a": "red",
    "c": "purple"
  }
]

0
投票

我遇到了这些答案(2024 年第 2 季度),并且不得不进行修补才能使其正常工作

jq-1.6

给定一系列对象:

# objects.json
{ "foo": "bar" }
{ "biz": "baz" }

我能够将它们嵌入到其他一些自定义对象中,如下所示:

# Type I: single object

cat objects.json \
 | jq -ns '{ type: "something", subtype: "specific", content: (inputs | add) }'  
# Type II: list object

cat objects.json \
 | jq -ns '{ type: "something", subtype: "specific", content: [inputs] }'  

特别是,I 型是我必须修补的地方。

© www.soinside.com 2019 - 2024. All rights reserved.