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_name、created_at)を使用しますが、Goの規約ではCamelCaseのエクスポートフィールド(UserName、CreatedAt)が必要です。構造体タグがこのギャップを橋渡しします。
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"`
}
変換ルール
コンバーターは以下の変換を適用します:
- アンダースコアで分割 —
user_idは["user", "id"]に分割されます。 - 各セグメントを大文字化 —
userはUserに、idはIDになります。 - セグメントを結合 —
UserIDになります。 - 一般的なイニシャリズム — Go規約では一般的な略語を大文字にします:
ID、URL、HTTP、API、JSON、HTML、CSS、SQL。
したがって、user_id は UserID(UserId ではなく)に、api_url は APIURL になります。
タグが不可欠な理由
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への変換が適切なアンマーシャリングに必要です。