REST APIレスポンスJSONからGo構造体への変換

典型的なREST APIレスポンスJSONを適切に構造化されたGo型に変換します。ページネーション、エラーエンベロープ、ネストされたリソースパターンを解説。

Patterns

詳細な説明

GoでのREST APIレスポンスのモデリング

ほとんどのREST APIはデータをページネーション、ステータス、エラー詳細などのメタデータを含む標準的なエンベロープでラップします。これらのパターンをGo構造体に変換するには、慎重な型モデリングが必要です。

典型的なAPIレスポンス

{
  "status": "ok",
  "data": {
    "users": [
      { "id": 1, "name": "Alice", "email": "alice@example.com" },
      { "id": 2, "name": "Bob", "email": "bob@example.com" }
    ]
  },
  "pagination": {
    "page": 1,
    "per_page": 20,
    "total": 152,
    "total_pages": 8
  }
}

生成されるGo構造体

type APIResponse struct {
    Status     string     `json:"status"`
    Data       Data       `json:"data"`
    Pagination Pagination `json:"pagination"`
}

type Data struct {
    Users []User `json:"users"`
}

type User struct {
    ID    int    `json:"id"`
    Name  string `json:"name"`
    Email string `json:"email"`
}

type Pagination struct {
    Page       int `json:"page"`
    PerPage    int `json:"per_page"`
    Total      int `json:"total"`
    TotalPages int `json:"total_pages"`
}

ジェネリックレスポンスラッパー

実際には、エンドポイント間で再利用するためにジェネリックラッパーを作成することが多いです:

type APIResponse[T any] struct {
    Status     string      `json:"status"`
    Data       T           `json:"data"`
    Pagination *Pagination `json:"pagination,omitempty"`
    Error      *APIError   `json:"error,omitempty"`
}

type APIError struct {
    Code    string `json:"code"`
    Message string `json:"message"`
}

使用法:ユーザーリストには APIResponse[UserListData]、注文には APIResponse[OrderData]

エラー処理

APIはエラー時に異なる構造を返すことが多いです。ポインタフィールドと omitempty の使用、または別のエラー構造体により、両方のケースをきれいに処理できます。

ユースケース

GoでAPIクライアントライブラリを構築するには、成功レスポンスとエラーレスポンスの両方をモデリングする必要があります。適切に設計された構造体階層により、任意のエンドポイントのレスポンスを同じラッパー型にアンマーシャリングできます。

試してみる — JSON to Go Struct Converter

フルツールを開く