JSONのsnake_caseからGoのCamelCaseへの変換

JSONのsnake_caseキー(user_nameなど)がGoのCamelCaseフィールド(UserNameなど)に適切なjson構造体タグ付きで変換される仕組みを理解します。

Struct Tags

詳細な説明

snake_caseのJSONキーからCamelCaseのGoフィールドへの変換

JSON APIは一般的にsnake_case命名(user_namecreated_at)を使用しますが、Goの規約ではCamelCaseのエクスポートフィールド(UserNameCreatedAt)が必要です。構造体タグがこのギャップを橋渡しします。

JSONの例

{
  "user_id": 1001,
  "first_name": "Alice",
  "last_name": "Smith",
  "created_at": "2024-01-15T10:30:00Z",
  "is_active": true
}

生成されるGo構造体

type User struct {
    UserID    int    `json:"user_id"`
    FirstName string `json:"first_name"`
    LastName  string `json:"last_name"`
    CreatedAt string `json:"created_at"`
    IsActive  bool   `json:"is_active"`
}

変換ルール

コンバーターは以下の変換を適用します:

  1. アンダースコアで分割user_id["user", "id"] に分割されます。
  2. 各セグメントを大文字化userUser に、idID になります。
  3. セグメントを結合UserID になります。
  4. 一般的なイニシャリズム — Go規約では一般的な略語を大文字にします:IDURLHTTPAPIJSONHTMLCSSSQL

したがって、user_idUserIDUserId ではなく)に、api_urlAPIURL になります。

タグが不可欠な理由

json:"user_id" タグがない場合、Goはフィールド名と完全に一致するJSONキー — "UserID" — を探し、"user_id" とのマッチングに失敗します。タグが2つの命名規則間のマッピングを作成します。

双方向変換

構造体をJSONにマーシャリングする際、タグにより出力は元のsnake_caseキーを使用し、API互換性を維持します:

data, _ := json.Marshal(user)
// {"user_id":1001,"first_name":"Alice",...}

この命名の橋渡しは非常に基本的であり、すべてのJSON-to-Goコンバーターが自動的に処理します。

ユースケース

Python、Ruby、および多くのデータベースORMはJSON出力でsnake_caseを使用します。GoからこれらのAPIを利用する場合、構造体タグによるsnake_caseからCamelCaseへの変換が適切なアンマーシャリングに必要です。

試してみる — JSON to Go Struct Converter

フルツールを開く