JQ 将对象映射到有条件的数组

dsf*_*fsf 15 bash json jq

我有这个输入数据:

[
  {
    "attributes": {
      "created": "2021-10-18T12:02:39+00:00",
      "enabled": true,
      "expires": null,
      "notBefore": null
    },
    "contentType": null,
    "id": "https://kjkljk./secrets/-/1",
    "managed": null,
    "name": "pw",
    "tags": {}
  },
  {
    "attributes": {
      "created": "2021-10-18T12:06:16+00:00",
      "enabled": true,
      "expires": null,
      "notBefore": null
    },
    "contentType": "",
    "id": "https://kjklj./secrets/-/2",
    "managed": null,
    "name": "pw",
    "tags": {}
  }
]
Run Code Online (Sandbox Code Playgroud)

我需要使用 jq 将 id 值提取到一个新数组中,其中启用设置为 true。这是我到目前为止所拥有的:

.[] | select(any(.attributes; .enabled== true)) | {id} 
Run Code Online (Sandbox Code Playgroud)

但它只会导致这样的结果:

{
  "id": "https://kjkljk./secrets/-/1"
}
{
  "id": "https://kjklj./secrets/-/2"
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能把这两个对象变成一个字符串数组呢?

[
  "id": "https://kjkljk./secrets/-/1",
  "id": "https://kjklj./secrets/-/2"
]
Run Code Online (Sandbox Code Playgroud)

pmf*_*pmf 22

使用map而不是.[]保留数组:

\n
map(select(any(.attributes; .enabled)) | {id})\n
Run Code Online (Sandbox Code Playgroud)\n
map(select(any(.attributes; .enabled)) | {id})\n
Run Code Online (Sandbox Code Playgroud)\n

演示

\n

请注意,这会生成一个对象数组[{\xe2\x80\xa6},{\xe2\x80\xa6}],我相信这就是您所要求的,尽管在您想要的输出中您缺少大括号{ }。要制作“字符串数组”,请使用.id而不是{id}像这样

\n
map(select(any(.attributes; .enabled)) | .id)\n
Run Code Online (Sandbox Code Playgroud)\n
[\n  {"id": "https://kjkljk./secrets/-/1"},\n  {"id": "https://kjklj./secrets/-/2"}\n]\n
Run Code Online (Sandbox Code Playgroud)\n

演示

\n

(此外,您可以使用.enabled代替.enabled == true

\n


Sha*_*awn 9

就像是:

$ jq '[.[] | select(.attributes.enabled) | .id]' input.json
[
  "https://kjkljk./secrets/-/1",
  "https://kjklj./secrets/-/2"
]
Run Code Online (Sandbox Code Playgroud)