JSON→Go構造体変換

JSONオブジェクト(またはJSON配列)を貼り付けると、対応するGoのstruct定義とjsonタグを自動生成します。

使い方のヒント

  • 配列の要素がすべてオブジェクトの場合、各要素のキーをマージして1つのstructを生成します。一部の要素にしか存在しないキーには自動的に `omitempty` を付与します。
  • ルート型の名前は初期値「Root」からお好みの名前に変更できます。ネストしたstructの型名は、そのプロパティ名をPascalCase化して自動生成されます。
  • JSONのnullはGoにネイティブなnull許容プリミティブが無いため `interface{}` として出力されます。厳密に扱いたい場合はポインタ型への置き換えを検討してください。
  • 生成結果はインデントを揃えた簡易フォーマットで出力されますが、貼り付け後に `gofmt` を通すとプロジェクトの標準スタイルに揃えられます。
  • API レスポンスのサンプルJSONをそのまま貼り付ければ、Goのレスポンス用struct定義のたたき台を素早く用意できます。

よくある質問

手作業でstructを書き起こすと、フィールド名の変換ミスやjsonタグの記入漏れが起きやすく、ネストしたオブジェクトが深い場合は特に時間がかかります。自動生成することでこれらのミスを防ぎ、実装にかかる時間を大幅に短縮できます。

JSONのキー(snake_caseやcamelCase)を先頭大文字のPascalCaseに変換し、Goでエクスポート可能なフィールド名にします。元のJSONキーはjsonタグ(`json:"元のキー"`)としてそのまま保持されるため、エンコード・デコードは問題なく行えます。

null値は`interface{}`型として出力されます。また配列内の一部要素にしか存在しないキーは自動的に`omitempty`付きのjsonタグになりますが、Go自体の型はゼロ値を取るだけなので、必要に応じてポインタ型への置き換えも検討してください。

JSON上の数値に小数点が含まれていれば`float64`、含まれていなければ`int`と判定します。ただしJSONの数値表現には桁数の情報しか残らないため、int64が必要なほど大きな値などは生成後に手動で調整してください。

Goにはユニオン型が無いため、同じキーでも要素によって型が食い違う場合は`interface{}`にフォールバックします。実際の型はランタイムで型アサーションを使って判定する必要があります。
ツールくん

余談ですが ― Goのstructとjsonタグという設計

Go言語は静的型付け言語であり、JSONを扱う際は標準ライブラリの`encoding/json`パッケージがstructのフィールドとjsonタグの対応関係を見てエンコード・デコードを行います。外部APIのレスポンス構造をstructとして手作業で書き起こすのは、フィールドが増えるたびに手間が増える定型作業であり、多くのGoプロジェクトで繰り返されてきました。

このツールはサンプルJSONの構造を解析し、対応するstruct定義とjsonタグを自動生成することで、この定型作業を省力化します。同種のツールとしては複数言語への型変換に対応した`quicktype`が知られていますが、手元のAPIレスポンスをそのまま貼り付けて素早くGoのstructを得たいだけの場面では、単機能ツールの手軽さにも利点があります。

Goには構造体のフィールドをオプショナルにする言語機能が無いため、JSON側で欠落し得るフィールドはjsonタグに`omitempty`を付けるか、ポインタ型(`*string`等)にしてゼロ値と「値が存在しない」状態を区別する設計が一般的です。生成されたstructはあくまで構造からの機械的な推論であり、nullable判定やAPIの将来的な変更を見越した設計は、実際の仕様書と照らし合わせて手動で調整するのが実務上の定石とされています。