機能
JSON → Go 変換ツールは JSON のサンプルを読み取り、encoding/json ですぐ使える json タグ付きの Go 構造体定義を書き出します。呼び出している API のレスポンスを貼り付ければ、すべてのフィールドとタグを手で書かなくても、json.Unmarshal にそのまま渡せる型が得られます。
変換ツールはサンプル内のすべての値を調べます。入れ子のオブジェクトは独自の構造体になり、配列の全要素は 1 つの要素型にまとめられ、一部の要素にないか時々 null になるフィールドは省略可能として検出されます。出力は gofmt と同じように整形されます。
使い方
- JSON を入力欄に貼り付けるか、
.jsonファイルをアップロードするか、サンプル をクリックします。 - ルート型の名前を設定し、入れ子のオブジェクトの書き方、
omitemptyを付けるフィールド、null 許容フィールドにポインタを使うかを選びます。 - Go のコードをコピーするか
.goファイルとしてダウンロードし、package行を追加します。
不正な JSON は問題のある行と列とともに表示されます。
例
この JSON は:
{ "id": 7, "user_name": "ada", "tags": ["admin"], "profile": { "avatar_url": "https://example.com/a.png" } }
次の構造体になります:
type Root struct {
ID int `json:"id"`
UserName string `json:"user_name"`
Tags []string `json:"tags"`
Profile Profile `json:"profile"`
}
type Profile struct {
AvatarURL string `json:"avatar_url"`
}
ヒント
- 1 つのサンプルからは、そこに含まれる内容しかわかりません。値が数値にも文字列にもなるなら両方を含めるか、複数のサンプルを配列にまとめてマージさせましょう。
- タイムスタンプは文字列として届きます。形式が RFC 3339 なら、型を自分で
time.Timeに変えてください。 - フィールドがまったく同じオブジェクトは 1 つの構造体を共有するので、同じ形が何か所にも出てきても出力は短く保たれます。
- TypeScript も書きますか?JSON → TypeScript 変換は同じ推論でインターフェースを生成します。
よくある質問
› フィールド名はどのように決まりますか?
JSON のキーはそれぞれ PascalCase のエクスポートされた Go 名に変換され、よくある略語は golint の期待どおり大文字になります。user_id は UserID、avatar_url は AvatarURL です。元のキーは json タグに残るので、encoding/json が正確にフィールドを対応付けます。
› どの Go の型が使われますか?
文字列は string、整数は int(32 ビットに収まらない値があれば int64)、小数は float64、真偽値は bool になります。配列はスライスに、空のオブジェクトは map[string]any に、null だけの値や複数の種類が混ざる値は any になります。
› 名前付き構造体とインライン構造体の違いは何ですか?
名前付きモードでは入れ子のオブジェクトを Address や Order のような独立した型として書くので、再利用やテストがしやすくなります。インラインモードでは匿名の構造体型を親の中に直接書き、すべてを 1 つの宣言にまとめます。多くの簡易変換ツールと同じ形です。
› omitempty はいつ付きますか?
既定では省略可能なフィールド、つまり配列内の一部のオブジェクトにないか時々 null になるフィールドだけに付きます。すべてのフィールドに付ける、まったく付けないことも選べます。ポインタをオンにすると、欠落や null とゼロ値を区別できます。
› JSON はアップロードされますか?
いいえ。構造体はブラウザ内で生成され、サーバーには何も送信されません。