JSON → Go 構造体

JSONからjsonタグ付きGo構造体を即座に生成。ネストオブジェクト・スライス・ポインタNullable・omitemptyタグ対応。無料、ブラウザ内で処理。

  • ブラウザ内で処理
  • データはブラウザ外に出ません
  • 無料 · 登録不要
空欄では RootObject を使います。名前の変更後は「Go Struct を生成」をクリックして適用します。
現在の JSON とルート名で生成します。Ctrl/⌘+Enter でも生成できます。
JSON を、ネストされたオブジェクト、配列、null を含むサンプルに置き換え、現在の設定ですぐに生成します。
JSON、出力、ステータスを消去し、ルート名を保持します。ツール内で Ctrl/⌘+L を押すとルート名も消去します。
コメントや末尾のカンマを含まない有効な JSON を入力します。入力を止めてから 300 ミリ秒後に生成します。無効な JSON では出力を消去し、エラーを表示します。
Go 出力
表示中の Go 出力を全文コピーします。出力が空の場合はコピーしません。

JSON を入力するかサンプルを読み込むと、Go を生成します。

例・詳しい説明・よくある質問 実際の出力つきの例、ほかのツールとの違い、よくある質問。

型マッピング

  • null → interface{}
  • 文字列 → string
  • 整数 → int
  • 浮動小数点数 → float64
  • 真偽値 → bool
  • 配列 → []T
  • nullable/省略可能 → ポインタ(*T)
  • ネストオブジェクト → 独立した名前付き struct

例:API レスポンス

{
  "user": {
    "id": 42,
    "name": "Alice",
    "email": "alice@example.com",
    "is_active": true,
    "roles": ["admin", "editor"],
    "address": { "city": "New York", "country": "US", "zip_code": "10001" },
    "last_login": null
  }
}

から次の構造体が生成されます。

type RootObject struct {
	User User `json:"user"`
}

type User struct {
	Id int `json:"id"`
	Name string `json:"name"`
	Email string `json:"email"`
	IsActive bool `json:"is_active"`
	Roles []string `json:"roles"`
	Address Address `json:"address"`
	LastLogin interface{} `json:"last_login"`
}

type Address struct {
	City string `json:"city"`
	Country string `json:"country"`
	ZipCode string `json:"zip_code"`
}

snake_case のキーは CamelCase のフィールド名になり、json タグに元のキーが残るので、encoding/json で双方向に対応します。フィールドは揃えられていないため、gofmt(または保存時に整形するエディタ)でタグを揃えてください。標準ライブラリでデコードします:

var root RootObject
if err := json.Unmarshal(data, &root); err != nil {
	log.Fatal(err)
}
fmt.Println(root.User.Name) // Alice

例:トップレベルが配列の場合

[{"sku": "A1", "qty": 2}, {"sku": "B2", "note": "gift"}]

から次の構造体が生成されます。

type RootObject struct {
	Sku string `json:"sku"`
	Qty *int `json:"qty,omitempty"`
	Note *string `json:"note,omitempty"`
}

トップレベルが配列のとき、構造体は要素1つ分を表すので []RootObject にデコードします。一部の要素にないキーは omitempty 付きのポインタになります。

例:同じキー名、小数、数字で始まるキー

{
  "order": { "id": "A-1001", "total": 19.0, "meta": { "createdBy": "alice", "source": "web" } },
  "payment": { "status": "paid", "meta": { "provider": "stripe", "fee": 0.3 } },
  "2fa": true
}

から生成される構造体:

type RootObject struct {
	Order Order `json:"order"`
	Payment Payment `json:"payment"`
	X2fa bool `json:"2fa"`
}

type Order struct {
	Id string `json:"id"`
	Total float64 `json:"total"`
	Meta Meta `json:"meta"`
}

type Meta struct {
	CreatedBy string `json:"createdBy"`
	Source string `json:"source"`
}

type Payment struct {
	Status string `json:"status"`
	Meta PaymentMeta `json:"meta"`
}

type PaymentMeta struct {
	Provider string `json:"provider"`
	Fee float64 `json:"fee"`
}

payment.meta は order.meta とフィールドが違うので別の構造体になり、親の名前を前に付けた PaymentMeta になります(同じフィールドなら両方で Meta を共有)。19.0 は小数点付きで書かれているので total は float64 です。encoding/json は 19.0 を int のフィールドにデコードしません。ツールはブラウザの JSON ソーステキストアクセス(Chrome 114+、Firefox 135+、Safari 18.4+)で数値の書き方を読みます。対応していないブラウザでは 19 に見えるため int のままです。キー 2fa はエクスポートされる名前の先頭に使えないので、フィールド名は X2fa、タグは 2fa のままです。

生成後に直すところ

  • null は interface{} になります。API ドキュメントを確認して *string や *time.Time など実際の型のポインタに変えてください。
  • . や指数のない数値は int、19.0 や 1e3 は float64 になります。同じ配列やキーに整数と小数が混ざると float64 です。サンプルがたまたま整数だけのフィールド(価格など)は int のままなので確認してください。64 ビット環境では int は 64 ビットです。
  • [] と、それ以外で要素の型が混在する配列は []interface{} になります。
  • フィールド名は Go の頭字語の慣習に合わせて調整されません。id は Id、url は Url になりますが、Go Code Review Comments は ID・URL を推奨しています。どちらでも json タグがあるのでデコードは正しく動きます。
  • フィールド名が大文字で始まらないキー(2fa、名前)は先頭に X を付けます(X2fa)。同じフィールド名になる 2 つのキー(user_id、userId)には番号を付けます(UserId2)。空のキーや、構造体タグに書けない文字("、, など)を含むキーは、encoding/json がタグで対応付けられないため、フィールドではなくコメントに書きます。
  • PaymentMeta や Meta2 のような名前は JSON のキーから作られます。用途に合わせて名前を変えてください。
  • 出力されるのは json タグだけです。gorm・bson・validate のタグは自分で追加します。

制限

  • 入力は有効な JSON である必要があります。エラーメッセージには位置が出ます(末尾のカンマなら Expected double-quoted property name in JSON at position 8)。
  • 型は貼り付けたサンプルだけから決まります。

FAQ

このツールは何を生成しますか?

json構造体タグ付きのGo struct型宣言を生成します。ネストされたJSONオブジェクトはそれぞれ独立した名前付きstructになります。配列フィールドはスライス([]T)になります。

Nullableフィールドはどう処理されますか?

サンプルで null しか出てこないキーは、型が分からないので interface{} になります。オブジェクトの配列では、一部の要素で null、ほかの要素で値があるキーは、その型のポインタ(*string など)になります。一部の要素にないキーはポインタ(スライスはスライスのまま)になり、json タグに ,omitempty が付きます。null が混ざるだけのキーには ,omitempty は付きません。

なぜポインタ型を使うのですか?

Go では、省略できる値や null になりうる値をポインタで表すのが慣用的なやり方です。*string は nil(キーがない、または null)を表せますが、string では表せません。

どんな json タグが付きますか?

すべてのフィールドに、元の JSON キーをそのまま書いた json タグが付きます。そのため、フィールド名を Go の公開名(大文字始まり)に変えても、スネークケースやキャメルケースのキーと対応します。配列の一部の要素にないキーには ,omitempty も付きます。空のキーや、ダブルクォート・カンマなど構造体タグに書けない文字を含むキーは、フィールドではなくコメントになります。生成するのは json タグだけです。

データはサーバーに送信されますか?

いいえ。構造体はブラウザーのタブの中で生成し、入力した JSON とルート構造体名をサーバーへ送ったり、ブラウザーのストレージに保存したりしません。入力欄の編集を終えたとき、「Go Struct を生成」をクリックしたとき、サンプルを読み込んだときに、ページのアクセス解析が利用イベント(ツール名と generate という操作名)を 1 件記録するだけで、JSON やコードは含みません。