m moji kit v1.0.9
変換 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 を整形・圧縮・キーソートします。