エラー '{"errorMessages" が発生しました: ["JSON の解析中にエラーが発生しました。リクエストの本文が有効であることを確認してください。"]}

エラー '{
curl --request POST \
          --url 'https://bankofloyal.atlassian.net/rest/api/2/issue' \
          --user [email protected]:$JIRA_TOKEN \
          --header 'Accept: application/json' \
          --header 'Content-Type: application/json' \
          --data '{
            "fields": {
              "project": {
                "key": "'$JIRA_PROJECT'"
              },
              "parent": {
                "key": "'$PARENT_ISSUE_KEY'"
              },
              "components": [
                {
                  "id": "'$COMPONENT_ID'"
                }
              ],
              "summary": "Directories with migration changes: '"${DIR_JOINED}"'",
              "description": "Name of models: '"${MODEL_NAMES}"'",
              "issuetype": {
                "name": "Sub-task"
              }
            }
          }'

cURLを使用して生成されたチケットを取得しようとすると、「JSON解析エラー」が発生します。デバッグ中に、bodyの概要と説明で変数DIR_CHANGEDと誤った使用が問題であることがわかりましたMODEL_NAME。他の方法を提案してもらえますか?

ベストアンサー1

シェル変数の実際の内容がわからないため、少なくとも1つに改行、タブ、二重引用符、またはJSON文書でエンコードする必要がある他の文字が含まれているとします。通常、JSONにシェル文字列を挿入しないでください。jqシェル変数で有効なJSONを作成するために使用されます。これにより、文字列が正しくエンコードされます。

以下のスクリプトスニペットでは、使用されている5つのシェル変数がjq 予想値に設定されていると想定しています。その後、スクリプトは、jq提供された「テンプレート」の適切な場所にJSONエンコード文字列として挿入されるシェル変数を提供してJSON文書を生成します。結果は、後でオプションのオプションパラメータpayloadとして使用されるシェル変数に割り当てられます。curl--data

payload=$(
        jq -n -c \
                --arg project_key "$JIRA_PROJECT" \
                --arg parent_key "$PARENT_ISSUE_KEY" \
                --arg components_id "$COMPONENT_ID" \
                --arg dirs "$DIR_JOINED" \
                --arg models "$MODEL_NAMES" '
        {
                fields: {
                        project: { key: $project_key },
                        parent: { key: $parent_key },
                        components: [{ id: $components_id }],
                        summary: ("Directories with migration changes: " + $dirs),
                        description: ("Name of models: " + $models),
                        issuetype: { name: "Sub-task" }
                }
        }'
)

curl --request POST \
          --user "[email protected]:$JIRA_TOKEN" \
          --header 'Accept: application/json' \
          --header 'Content-Type: application/json' \
          --data "$payload" \
          'https://bankofloyal.atlassian.net/rest/api/2/issue'

$dirsandなどの式で使用される変数に注意してください。$project_keyjqjq変数です、シェル変数ではありません。コマンドライン--argのオプションから値を取得しますjq

summary合計キーの値である括弧式は、description最終値を取得するために評価する必要がある式なので、括弧で囲みます。

文字列以外のデータを含む変数を作成する必要がある場合jq(たとえば、ブール値、数値、またはJSON文書の断片を挿入する必要がある場合)、代わりに--argjsoninを使用してください--arg(つまり、jq ... --argjson components_id "$COMPONENT_ID" ...コンポーネントのIDが数値である必要がある場合)。文字列ではなく)。

おすすめ記事