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

()を使用してこれらのヘッダーを要求したため、応答にはcurlHTTPヘッダーが含まれます。これは、変数の内容にHTTPヘッダーと一部のJSONが含まれることを意味します。-i--includecreated

ツール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に似たシェルでは、分割+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"
$

関連情報