如何使用 jq 从 json 数组/对象中获取多个值

dev*_*min 8 shell jq

如何在一行中使用 jq 从 JSON 数组/对象中获取多个值?

这里是curl请求及其响应

curl -s -k --location --request GET "https://${HOSTNAME}/api/v1/projects/myProjects?page=1&pageSize=2" --header "Authorization: Bearer "$token"" | jq -r '.["data"]'


# Response
[
  {
    "id": "8a70803f8045722601804f62d54c5d9d",
    "createdBy": "8a70802980325cdc0180326b5fe60006",
    "createdDate": "2022-04-22T03:48:38.860+0000",
    "modifiedBy": "8a70802980325cdc0180326b5fe60006",
    "modifiedDate": "2022-04-22T03:48:38.860+0000",
    "version": null,
    "inactive": false,
    "name": "Netbank734113",
  },
  {
    "id": "8a70801c804568ae01804f625a923f8d",
    "createdBy": "8a70802980325cdc0180326b5fe60006",
    "createdDate": "2022-04-22T03:48:07.442+0000",
    "modifiedBy": "8a70802980325cdc0180326b5fe60006",
    "modifiedDate": "2022-04-22T03:48:07.442+0000",
    "version": null,
    "inactive": false,
    "name": "Netbank734112",
  }
]

Run Code Online (Sandbox Code Playgroud)

现在尝试以下命令在一行中获取 id 和名称,但会出现重复的结果。

result=$(curl -s -k --location --request GET "https://${HOSTNAME}/api/v1/projects/myProjects?page=1&pageSize=2" --header "Authorization: Bearer "$token"" | jq -r '.["data"]|.[].name +" "+  .[].id')

echo "$result"

# response
Netbank734113 8a70803f8045722601804f62d54c5d9d
Netbank734112 8a70803f8045722601804f62d54c5d9d
Netbank734113 8a70801c804568ae01804f625a923f8d
Netbank734112 8a70801c804568ae01804f625a923f8d

Run Code Online (Sandbox Code Playgroud)

我如何摆脱那些重复的值并基本上得到以下响应?

Netbank734113 8a70803f8045722601804f62d54c5d9d
Netbank734112 8a70801c804568ae01804f625a923f8d

Run Code Online (Sandbox Code Playgroud)

尝试此命令并输入以下错误,如何修改此curl命令以获得所需的结果。

result=$(curl -s -k --location --request GET "https://${HOSTNAME}/api/v1/projects/myProjects?page=1&pageSize=2" --header "Authorization: Bearer "$token"" | jq -r '["data"]|.[].unique_by(.name, .id) | map([.name, .id])[] | @tsv')

# error response

jq: error: syntax error, unexpected '(', expecting $end (Unix shell quoting issues?) at <top-level>, line 1:
["data"]|.[].unique_by(.name, .id) | map([.name, .id])[] | @tsv                      
jq: 1 compile error
 
# This one worked
result=$(curl -s -k --location --request GET "https://${HOSTNAME}/api/v1/projects/myProjects?page=1&pageSize=2" --header "Authorization: Bearer "$token"" | jq -r '.["data"]|.[]|.| .name + " " + .id')

Run Code Online (Sandbox Code Playgroud)

pmf*_*pmf 14

.[].name + " " + .[].id\'你在数组上迭代两次时。迭代一次并一次性提取数据:

\n
curl \xe2\x80\xa6 | jq -r \'.data[] | .name + " " + .id\'\n
Run Code Online (Sandbox Code Playgroud)\n
Netbank734113 8a70803f8045722601804f62d54c5d9d\nNetbank734112 8a70801c804568ae01804f625a923f8d\n
Run Code Online (Sandbox Code Playgroud)\n

演示

\n
\n

您可能还对使用字符串插值感兴趣:

\n
curl \xe2\x80\xa6 | jq -r \'.data[] | "\\(.name) \\(.id)"\'\n
Run Code Online (Sandbox Code Playgroud)\n

演示

\n