JSON→Go構造体

次へ

JSONのサンプルを貼り付けると、encoding/jsonできれいに解析できるGoの構造体定義が得られます。フィールドはエクスポートされ(CamelCase)、元のJSONキーでタグ付けされ、値がnullになり得る場合はポインターに昇格し、ネストされたオブジェクトはそれぞれ名前付きの構造体宣言を得ます。

JSONをGo構造体に変換する方法

  1. 1

    JSONを貼り付ける

    単一のサンプルで十分です。複数のサンプルはnullable推論を改善します。

  2. 2

    命名を選ぶ

    エクスポートされたフィールドのPascalCaseがGoの慣習です。略語のスタイル(`URL` vs `Url`、`ID` vs `Id`)を選びます。

  3. 3

    オプショナルの戦略を選ぶ

    nullableなフィールドにポインターを使う(最も慣用的)か、`omitempty`タグを使います。

  4. 4

    構造体をコピー

    1つのルート構造体とネストされたもの。`.go`ファイルに貼り付けて`go build`を実行します。

出力例

入力:

{ "first_name": "Alice", "age": 30, "email": null, "tags": ["admin"] }

出力:

type User struct {
    FirstName string   `json:"first_name"`
    Age       int      `json:"age"`
    Email     *string  `json:"email"`
    Tags      []string `json:"tags"`
}

型のマッピング

JSONの値 Goの型
文字列 string
整数 int または int64
数値(小数) float64
真偽値 bool
null(非nullの兄弟がある場合) *T(ポインター)
配列 []T
オブジェクト 名前付き構造体
混在した配列 []interface{}

ジェネレーターが従う命名の慣用

  • 頭字語は大文字化id -> IDurl -> URLapi_key -> APIKey。これはGoの推奨スタイル(およびgo vet / staticcheckのルール)に合致します。
  • snake_caseのJSON -> PascalCaseのフィールドfirst_name -> FirstName
  • 単語1つの頭字語は保持IPIPHTTPHTTPのまま。
  • JSONタグjson:"first_name"は元のキーを保ち、エンコードがきれいに往復します。

オプショナルなフィールド:ポインターかomitemptyか?

戦略 使うとき
ポインター(*T 「不在」と「ゼロ値」を区別する必要がある
omitempty マーシャル時にゼロ値をスキップしたいだけ。アンマーシャルは欠如にゼロを格納する
どちらでもない フィールドは常に存在し、ゼロ値が意味を持つ

ジェネレーターは、nullと見なされたものについては既定でポインター+omitemptyにします。セマンティクスに合わせて調整してください。

よくある間違い

  • 32ビットのターゲットでJSONの整数がMaxInt32を超えるのにintを使う。 既知の大きな値にはint64を使ってください。
  • マーシャルし直してキーの順序を失う。 encoding/jsonは元のJSONの順序ではなく、フィールド宣言の順序でキーを出力します。正規の出力が必要なら手動で並べ替えてください。
  • 形の混在した配列。 []interface{}は型安全性を失います。代わりにtypeの判別フィールドを持つユニオン型を検討してください。
  • オプショナルにomitemptyを忘れる。 それがないと、オプショナルなフィールドは省略されずに"foo": nullとしてシリアライズされます。

よくある質問

「フィールドの不在」と「フィールドがゼロ」を区別する必要があるときはポインターを使います。ゼロ値が正当な業務上の値でないとき(""0falseが常に「これをスキップ」を意味するとき)はomitemptyを使います。多くのチームは1つを選び、コードベース全体で一貫して適用します。

各ネストされたオブジェクトは別の名前付き構造体宣言になります(例:User -> Address)。型がインライン化されるのは、ネストされた構造体が小さく一度しか使われないときだけで、それ以外はきれいで再利用可能な型が得られます。

はい。idIDurlURLapi_keyAPIKeyになります。これはgo vetが期待し、ほとんどのGoのスタイルガイドが推奨するものです。

ジェネレーターは標準のjson:タグを持つ素の構造体を出力します。カスタムのUnmarshalJSONの実装(例:非ISO形式の日付)には、生成後に手動で追加してください。

関連ツール

このツールは他の言語でも利用できます