0Pricing
Go Academy · レッスン

JSONレスポンスのデコード

APIレスポンスをGoの構造体に解析します。

「JSONレスポンスのデコード」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。

デコードする前にステータスを確認する

ボディをデコードする前に、レスポンスのステータスが必ず 2xx であることを確認してください。2xx 以外のレスポンスには、JSON ではなく HTML のエラーページが含まれている場合があります。

if resp.StatusCode < 200 || resp.StatusCode >= 300 {
    body, _ := io.ReadAll(resp.Body)
    return fmt.Errorf("status %d: %s", resp.StatusCode, body)
}

json.NewDecoder

レスポンスボディ全体をメモリに読み込まず、ストリームとしてデコードします:

var result APIResponse
if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
    return fmt.Errorf("decode: %w", err)
}

汎用マップへのデコード

JSON の構造が不明または動的な場合は、map[string]any にデコードします:

var m map[string]any
json.NewDecoder(resp.Body).Decode(&m)

ネストした構造体

ネストした Go の構造体と json タグを使って、ネストした JSON をモデル化します:

type Repo struct {
    Name  string `json:"name"`
    Owner struct {
        Login string `json:"login"`
    } `json:"owner"`
}

ポインターによるオプションフィールド

オプションの JSON フィールドにはポインター型を使用すると、「フィールドが存在しない」場合と「フィールドにゼロ値が設定されている」場合を区別できます:

type Response struct {
    Data  *string `json:"data"`
    Error *string `json:"error"`
}

配列のデコード

JSON 配列は Go のスライスに直接デコードできます:

var users []User
json.NewDecoder(resp.Body).Decode(&users)

デコードエラーの確認

JSON の構文エラーと予期しない EOF エラーを区別してください。EOF はボディが空で、JSON がまったくないことを意味します。

err := json.NewDecoder(resp.Body).Decode(&v)
if errors.Is(err, io.EOF) {
    return fmt.Errorf("empty response body")
}

Content-Type の確認

HTML を JSON として暗黙に解析しないよう、デコードする前にレスポンスの Content-Type が application/json であることを確認してください。

ct := resp.Header.Get("Content-Type")
if !strings.HasPrefix(ct, "application/json") {
    return fmt.Errorf("unexpected content-type: %s", ct)
}

未知のフィールドを無視する

json.Decoder は、対応する構造体フィールドがない JSON フィールドを暗黙に無視します。これはデフォルトの動作であり、通常は前方互換性のために望ましいものです。

DisallowUnknownFields による厳密なデコード

未知のキーに対してエラーを返すには dec.DisallowUnknownFields() を呼び出します。厳密な設定ファイルの解析には便利ですが、サードパーティ API の利用には適していません。

dec := json.NewDecoder(r.Body)
dec.DisallowUnknownFields()
dec.Decode(&cfg)

デコード済み構造体の再利用

複数のレスポンスにわたって構造体を再利用する場合は、以前のデコード結果が残らないよう、デコード前に構造体をゼロ化してください。

var result APIResult
result = APIResult{} // reset
json.NewDecoder(resp.Body).Decode(&result)

クイックチェック

レスポンスボディが空の場合、json.Decoder.Decode はどのようなエラーを返しますか?

振り返り:JSON レスポンスのデコード

主なポイント:

  • デコードする前にステータスコードを確認する
  • ストリーミングには json.NewDecoder を使用し、ボディ全体をメモリに読み込まない
  • Content-Type が application/json であることを確認する
  • io.EOF は空のボディ、io.ErrUnexpectedEOF は途中で切れた JSON を意味する

よくある質問

「JSONレスポンスのデコード」レッスンは無料ですか?

はい。「JSONレスポンスのデコード」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。

「JSONレスポンスのデコード」で何を学びますか?

APIレスポンスをGoの構造体に解析します。 ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Go Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「JSONレスポンスのデコード」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このGo Academyレッスンでコードを書いて実行できますか?

はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. HTTPリクエストの送信
  2. タイムアウトとヘッダーの設定
  3. JSONレスポンスのデコード
  4. エラー処理とリトライロジック
← Go Academyに戻る