GoのJSON構造体タグの理解
Goのjson構造体タグを深く解説します。フィールド命名、omitempty、stringオプション、フィールド無視のためのダッシュなど、JSONシリアライゼーション制御に必須の知識です。
Struct Tags
詳細な説明
GoのJSON構造体タグの解説
構造体タグは、GoがJSONのシリアライゼーションとデシリアライゼーションを制御するための主要なメカニズムです。json タグはフィールド型の後にバッククォート内に配置されます。
タグの構文
type Config struct {
Name string `json:"name"`
Version int `json:"version"`
Debug bool `json:"debug,omitempty"`
Internal string `json:"-"`
Count string `json:"count,string"`
}
タグオプション
| オプション | 意味 |
|---|---|
json:"name" |
このフィールドをJSONキー "name" にマッピング |
json:"name,omitempty" |
フィールドがゼロ値の場合、出力から省略 |
json:"-" |
マーシャル/アンマーシャル時に常にこのフィールドを無視 |
json:"count,string" |
数値やboolをJSON文字列としてエンコード/デコード |
json:",omitempty" |
フィールド名をそのまま使用するが、空の場合は省略 |
タグが重要な理由
タグがない場合、GoはフィールドフィールドをJSONキーとして直接使用します。Goフィールドはエクスポートされる(大文字)必要があるため、JSON出力で "name" の代わりに "Name" が得られます。タグにより、消費または生成するAPIの正確な大文字小文字と命名に一致させることができます。
string オプション
一部のAPIは数値を文字列として送信します:"count": "42"。string オプションはこれを透過的に処理します:
Count int `json:"count,string"`
これにより、encoding/json はJSON文字列を期待し、その中の数値をパースします。
オプションの組み合わせ
omitempty と string を組み合わせることができます:
Price float64 `json:"price,omitempty,string"`
構造体タグの理解は、GoでのJSON処理の正確さに不可欠です。Goの型システムと柔軟なJSONの世界を橋渡しする役割を果たします。
ユースケース
JSON APIと対話するすべてのGoプロジェクトは構造体タグを必要とします。フィールド名をAPIコントラクトに一致させ、内部フィールドを隠し、数値文字列などのエッジケースを処理するために不可欠です。