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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- HTTPリクエストの送信
- タイムアウトとヘッダーの設定
- JSONレスポンスのデコード
- エラー処理とリトライロジック