created=$(curl -i -X POST -H 'Content-Type:application/json' --data "$(payload)" https://myurl/resource)
上面返回一个json对象
{
"revision": {
"clientId": "",
"version": 1,
"lastModifier": "admin"
},
"id": "idvalue",
"uri": "https://myurl/idvalue",
"position": {
"x": 100,
"y": 200
}
}
我使用下面的代码从上面的对象获取 id
idvar=$(echo $created | jq ' .id' )
但上面给了我下面的错误
parse error: Invalid numeric literal at line 1, column 9
答案1
来自的响应curl
将包含 HTTP 标头,因为您使用-i
( --include
) 请求这些标头。这意味着created
变量的内容将包含 HTTP 标头,然后是一些 JSON。
该jq
工具无法解析 HTTP 标头,因此它会抱怨。标准 HTTP 响应标头以类似HTTP/1.1 200 OK
. “第 1 行,第 9 列”位置恰好是该字符串具有第一个空格字符的位置,JSON 解析器在此放弃并报告错误。
从调用中删除该-i
选项curl
应该可以使您的代码正常工作,尽管如果您只需要键的值id
,则实际上不需要将 的输出存储curl
在中间变量中:
curl -X POST \
--header 'Content-Type:application/json' \
--data "$json_document" \
'https://myurl/resource' | jq -r .id
但如果你仍然需要这样做,请记住
- 不能用来
echo
输出任意数据,尤其是 JSON,它通常包含反斜杠字符(许多echo
实现会破坏)。 - 在除 zsh1 之外的类似 Bourne 的 shell 中,必须引用参数扩展以防止 split+glob
所以它应该是:
printf %s "$created" | jq -r .id
zsh
1 不过引用也没有什么坏处。
答案2
如果从查询字符串中删除空格,它会起作用:
$ idvar=$(echo $created | jq '.id' )
$ echo $idvar
"idvalue"
$
我会考虑使用 JMESpath 中的 jp (https://github.com/jmespath/jp),因为它具有更好精确定义的语言语法。
$ echo $created | jp "id"
"idvalue"
$