如何解决文档后跟数字时"Cannot index number with string" jq错误?



我正在从bash脚本对服务器进行curl调用。在响应中,我想使用jq提取一些数据。但是,我从jq

得到以下错误
jq: error (at <stdin>:1): Cannot index number with string "_links"

脚本部分:

#!/bin/bash
set -e
keyword="config"
response=$(curl --location "${HEADERS[@]}" -s -w "%{http_code}n" -X GET "$url")
if echo ${response} | grep "$keyword" ; then
extract=$(jq -r "._links" <<< "${response}")
echo "$extract"
fi

实际响应:

{
"config": {
"polling": {
"sleep": "00:20:00"
}
},
"_links": {
"deployment": {
"href": "https://www.example.com"
},
"configData": {
"href": "https://www.example.com/configData"
}
}
}
200

谁能告诉我这里出了什么问题?Thanks in advance

p。S:我在Ubuntu上测试(在WSL上)。如果缺少任何信息请告诉我

如果你的输入有一个JSON文档后面跟着其他内容,你可以让你的jq只读取一个输入:

extract=$(jq -n "input | ._links" <<<"$response")

-n告诉jq默认不读取任何内容;-n,只使用一次,告诉它读一个东西。


您还可以提取_links属性HTTP状态码,只需调用一次jq:

IFS=$'n' read -r -d '' extract http_code < <(
jq -nc '
input as $full_doc | input as $status_code |
(($full_doc | ._links), $status_code)
' <<<"$response" && printf ''
)

使用read -d ''会导致read如果在输入的末尾没有找到NUL就失败,如果jq报告成功,&& printf ''会在进程替换的输出的末尾添加一个NUL。

您的变量response包含您所显示的内容。变量的实际内容是:

{
"config": {
"polling": {
"sleep": "00:20:00"
}
},
"_links": {
"deployment": {
"href": "https://www.example.com"
},
"configData": {
"href": "https://www.example.com/configData"
}
}
}
200

200被添加到输出中,因为您调用了curl -w "%{http_code}n",它将向输出中添加响应状态码。如果您计划处理输出,请去掉-w选项(您没有使用jq解析它,因此不需要它)。

如果您需要200作为输出的一部分,那么您可以指示jq将完整的输入读入单个数组中,并且只对第一个项目进行操作:

jq -s 'first._link' <<< "$response"

但在这种情况下,我建议使用Charles Duffy的答案,并将-ninput结合使用。

相关内容