JSON to Go Struct — JSON から Go Struct 类型を生成
JSON から json tag 付きの Go struct を生成します。CamelCase フィールド、可 null 値に omitempty、time.Time 自動検出——ブラウザ内だけで完結、アップロード不要。
JSON to Go Struct
Convert JSON to Go struct with json tags. Works entirely in your browser.
Go の標準ライブラリには、あらゆる言語の中でも最も広く使われている JSON パーサのひとつ、encoding/json が付属しています。このパーサは高速で正確、そして「強いこだわり」で有名です——エクスポートされた CamelCase(先頭大文字)のフィールドを要求し、JSON キーから struct フィールドへの対応付けは struct tag を通じて解決します。あらゆる API レスポンスに対して Go struct を手で書くは、Go サービス開發で最も常见的雑務であり、たいていは代表的な JSON レスポンスを 1 つコードジェネレータに貼り付けるところから始まります。ジェネレータは JSON オブジェクトを走査し、各値の Go 型を推論して、正しい json tag 付きの struct を出力します——手でやれば 5 分、 machine なら 5 ミリ秒で済む作業であり、しかも machine は null 許容フィールドの omitempty を忘れません。
Go 特有的であまり自明でないニュアンスは、ポインタ型です。JSON では、フィールドは「存在して値を持つ」「存在するが null」「欠落」のいずれかです。Go では、ゼロ値(空字符串、int のゼロ、bool の false)と欠落値は、通常の非ポインタフィールドでは区別がつきません。標準ライブラリの解決策が omitempty です。json:"key,omitempty" tag 付きのフィールドはゼロ値を保持しているとき出力から省略され、ポインタ型(*string に omitempty 付き)はポインタが nil のときに省略され、ポインタが非 nil のときはゼロ値として出力されます。ジェネレータは、サンプル内の null 許容フィールドにはポインタを、常に存在するフィールドには非ポインタを選びます——多くの API にとって妥当なデフォルトですが、API が null と欠落を使い分けている場合は確認する価値があります。
最後に引き継ぎについて:生成された struct を Go サービスに組み込むなら、日付解析・列挙検証・多態ディスパッチのためのカスタム UnmarshalJSON メソッドを追加してください。行き先がデータベースなら、json tag と並んで db tag も追加して ORM 互換にしてください。生成された struct はスキーマであり、それを読み書きするビジネスロジックこそが開発者の手元に残すべき部分です。
使い方
JSON を貼り付ける
JSON オブジェクト、またはオブジェクトの配列を入力欄にドロップします。ジェネレータは構造を走査し、ルートに対して Go struct を出力し、各オブジェクトの形に対してネストした struct を生成します。
命名規則を選ぶ
CamelCase フィールド(Go の慣習的なエクスポート名)と、json tag 付きの全小文字のどちらかを選べます。null 許容値には `omitempty` を切り替えることで、標準ライブラリの JSON マーシャラに準拠させられます。
struct をコピーまたはダウンロード
Go struct をクリップボードにコピーするか、.go ファイルとしてダウンロードできます。出力は `encoding/json` と `json.Unmarshal` にそのまま貼り込んで使えます——追加の import は不要です。
よくある質問
なぜ数値フィールドが int ではなく float64 になるのですか?
JSON の数値は仕様上、整数か浮動小数点かを区別しません。ジェネレータは、小数点を含む数値は既定で `float64`、整数値は `int` になります。サンプルデータが API が返し得る値の範囲を網羅していない場合は、手動で型アサーションを追加してください。
JSON の null 値はどのように扱われますか?
サンプルで null のフィールドは、`omitempty` 付きのポインタになります:`*string` `json:"key,omitempty"`。これは Go の慣習です——nil ポインタは「欠落」を、ポインタが指す先のゼロ値は「存在するが中身は空」を意味します。フィールドが決して欠落しないと分かっている場合は、ポインタと omitempty tag を取り除いてください。
JSON 用の struct tag を出力しますか?
はい、すべてのフィールドに `json:"original_key"` または `json:"original_key,omitempty"` の tag が付与されます。tag は元のキー名の大文字小文字をそのまま保持するため、JSON が snake_case で Go struct のフィールドが CamelCase というケースで特に重要になります。
ネストされたオブジェクトや配列はどうなりますか?
ネストされたオブジェクトは JSON キーから派生した CamelCase 名を持つネスト struct になり、配列は `[]Type` スライスになります。混合型の配列は `[]interface{}` になります——配列が異種混合の場合は、手動で型アサーションや Unmarshal のステップを追加してください。
main 関数も生成しますか?
いいえ。出力されるのは型定義——つまり struct だけです。`func main()` のエントリポイントと `json.Unmarshal` の呼び出しは自分で書いてください。ジェネレータの役割は繰り返しの型定義作業を解消することであり、Go プログラム全体を書くことではありません。
制限事項
- カスタム Unmarshal ロジックは未対応struct はデフォルトの encoding/json Unmarshal 挙動を用います。独自の日期格式(RFC 3339 以外)、数値列挙、多態ディスパッチ用の型キーを使う場合は、手動で UnmarshalJSON メソッドを記述する必要があります。
- 単一のサンプルからのみ型を推論サンプルで数値のフィールドが、別の API レスポンスでは文字列かもしれません。ジェネレータはサンプルから型を推論するため、API の挙動が一貫していない場合は必ず確認してください。
- ジェネリクスには未対応出力はジェネリクス以前の Go(型パラメータなし)です。Go 1.18+ のジェネリクスが必要な場合は、出力を後処理して型制約やインタフェース制約を手動で追加してください。
プラットフォーム別の注意点
- macOS
- GoLand、Go 拡張を入れた VS Code、vim-go はいずれも生成された struct を受け入れます。ブラウザツールは、ブラウザやターミナルから貼り付けたサンプル API レスポンスからの一回限りの生成に適しています。
- Windows
- Windows 上の GoLand と VS Code はいずれも生成された struct を扱えます。ブラウザツールは、チャット・メール・API エクスプローラから貼り付けた内容を、IDE を開かずに Go struct として起こしたいときに適しています。
- Linux
- コマンドライン作業では、`quicktype --lang go` や `gojson` が標準的な代替手段です。ブラウザツールは、CLI をインストールするほどのセットアップ時間をかけたくない一回限りの生成に適しています。
- Web
- 完全にクライアントサイドで動作。ページの読み込み後はオフラインでも使えます。制限のある環境や、コードレビュー中の素早い変換に役立ちます。