curl jq 从字段名称获取值

curl jq 从字段名称获取值
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

zsh1 不过引用也没有什么坏处。

答案2

如果从查询字符串中删除空格,它会起作用:

$ idvar=$(echo $created | jq '.id' )
$ echo $idvar
"idvalue"
$

我会考虑使用 JMESpath 中的 jp (https://github.com/jmespath/jp),因为它具有更好精确定义的语言语法。

$ echo $created | jp "id"
"idvalue"
$

相关内容