変換 JSON → Go struct
JSON から Go の struct を作る
JSON サンプルから Go の struct と json タグを生成する方法を整理しています。API クライアント実装の出発点に使えます。
解説
Go では JSON のキーを PascalCase のフィールドに対応させ、json タグで元のキー名 (多くは snake_case) を保持します。Go は大文字始まりのフィールドだけが (un)marshal の対象になるため、タグなしだとサーバーとの命名差を吸収できません。 JSON 上の数値が int か float かは曖昧なので整数で推測し、float が必要なら手で直します。null を取りうるフィールドは *T (ポインタ) や sql.Null* で表現します。
サンプル入力(JSON)
{
"id": 42,
"name": "alice",
"is_admin": false,
"tags": ["editor"]
} サンプル出力(Go struct)
type User struct {
ID int `json:"id"`
Name string `json:"name"`
IsAdmin bool `json:"is_admin"`
Tags []string `json:"tags"`
} 使うときのコツ
- · null 可能なフィールドは *string / *int 等のポインタ型にすると nil を表現できる
- · 「omitempty」を json タグに付けると 0 値(0 / "" / false)の field を出力時に省略
- · json.RawMessage を使うと未確定スキーマの部分を遅延パースできる
よくある質問
▶ JSON のキーが snake_case のとき、Go のフィールド名は?
Go ではエクスポートのため大文字始まりが必要なので、CamelCase(IsAdmin)にしてタグで `json:"is_admin"` を指定します。略語は全大文字慣習(ID / URL 等)。
▶ 数値が int か float か判定が難しい
JSON 仕様では区別できないので Go では float64 で受けるのが安全です。整数として扱いたいなら json.Number 型を使うか、サーバー側でフィールドの型を保証してもらうのが確実。
▶ ネストしたオブジェクトの型はどうする?
別の struct として切り出すか、無名構造体(インライン)で書きます。再利用するなら別名 struct にします。
▶ オプショナルなフィールドは?
ゼロ値(int: 0、string: "")と「未指定」を区別したいならポインタ型 (*int) や sql.NullX を使います。Marshaling 時に omitempty タグを併用すると省略できます。
▶ encoding/json と json-iterator どちらが速い?
json-iterator/go は標準より 2-3 倍速いと言われ、API 互換性もあります。本格運用ではプロファイルして判断してください。
▶ ツールで自動化したい
JSON-to-Go (mholt.github.io/json-to-go) が古典的に有名です。VS Code 拡張や Goland にも組み込まれています。
関連ツール
JSON フォーマッタ
JSON を整形・圧縮・キーソートします。