型生成

JSONからGo構造体実際のレスポンスに合う型のたたき台

2件のサンプルで異なるフィールドを確認してください。出力にはパッケージ宣言と必要なimportを含めます。

JSONからGo構造体

JSON入力

解析と生成はブラウザー内で行い、入力のアップロードや保存はしません。

Go出力

生成設定

anyの数値にはDecoder.UseNumber()が必要です。ポインタは欠落とnullを区別しません。

3宣言・2ポインタ型

JSONからGo構造体を起こすときは、同じAPIの複数レスポンスを配列にまとめると便利です。1件では分からないフィールドの欠落やnull、型の違いも推論に反映できます。

生成結果は確認用の初稿です。サンプルに出てこない値や必須項目、業務上の制約まで判断するものではありません。

JSONからGo構造体を作る理由

配列の後半も型の根拠にする

JSONからGo構造体への変換では同じ配列位置の全要素を調べます。2件目にしかないキーも残し、型が分かる値と欠落やnullの組み合わせにはポインタを使えます。

異なるフィールドを持つ2枚のカードが1つの構造へ合流し、欠落値を中空の印で示す図。

数字を丸める前に型を選ぶ

int64範囲内の通常の整数だけをint64にします。小数、指数表記、範囲外の整数はjson.Numberとして扱い、JavaScriptの浮動小数点数を経由して桁を失うことを避けます。

長い数字のブロック列が末尾まで欠けずに出力側の構造へ入る図。

保存前に推論を確かめる

01

同じ用途のサンプルをまとめる

同じレスポンス形式の複数レコードを配列に入れます。別のプロパティにある似たオブジェクトを同じ型へ自動統合することはありません。

02

文字列として残す条件を決める

日時の元表記が必要なら日時推論をオフにします。「ネスト型に名前を付ける」をオフにすると構造体をインライン化できます。タグを外すと元キーとの対応も失います。

03

最新の設定で再生成する

自動生成は変更後350ミリ秒待ちます。オフなら生成ボタンかCtrl/Cmd+Enterを使用します。入力や設定を変えると、成功するまでコピーと保存が無効になります。

フィールド名と値の扱い

公開フィールドとJSONタグ

Go構造体変換ではsnake_caseやcamelCaseから大文字始まりのASCII名を作り、IDなどの略語は維持します。衝突には数字を付け、タグを有効にすれば対応可能な元キーを保持します。

ポインタ型に必要な根拠

型が分かるスカラーや構造体にnullや欠落があればポインタ型にします。スライスとマップはそのままnilを表せます。nullだけならanyであり、ポインタでも欠落と明示的なnullは区別できません。

整数以外は数値トークンを保持

1.0や1e3は数学的には整数でもjson.Numberです。encoding/jsonがその表記をint64へ直接デコードできないためです。演算前にはNumberの変換エラーも確認してください。

ネスト型と有効な日時

完全なRFC3339で実在する日付だけをtime.Timeに推論し、小数秒は9桁までに制限します。その位置の全非null文字列が条件を満たす必要があります。ルートの型別名は元型のメソッドを保持します。

出力が保証しないこと

既存プロジェクト向けのコード
anyを使うためGo 1.18以上を対象にし、encoding/jsonのv1互換タグだけを生成します。Schema、omitempty、独自デコーダー、検証処理は生成しません。実際のプロジェクトでgofmtとテストを実行してください。
タグで表現できないキー
空キー、カンマ、引用符、バックスラッシュ、バッククォート、制御文字、絵文字はタグ有効時にパス付きで拒否します。必要ならマップや独自デコーダーを使います。キー-には無視を防ぐためタグ-,を付けます。
不明な型の数値に注意
混在型はany、空配列は[]any、空オブジェクトはmap[string]anyです。これらへ数値を読み込む場合はDecoder.UseNumber()が必要です。標準のままではfloat64になり、生成だけで精度は保証されません。
日時の文字列は往復一致しない
日付だけ、時区なし、不正な日付、10桁以上の小数秒はstringのままです。time.Timeの再エンコードでは時区表記や末尾のゼロが正規化される場合があります。原文を残すなら日時推論を無効にしてください。
厳密な入力と上限
コメント、重複キー、末尾カンマ、複数文書を拒否します。URL取得、ファイル入力、修復機能はありません。入力500,000文字、深さ100、50,000ノード、1,000宣言、出力1,000,000文字が上限です。

JSONからGo構造体への変換に関する質問

フィールド名はGo向けにどう変わりますか?

公開可能な大文字始まりのASCII名に変え、IDなどの略語を保ちます。同名になる場合は数字を付けます。有効なJSONタグが元のキーを結び付けるため、タグを外す場合はデコード時の名前を確認してください。

nullや欠けたフィールドの型はどう決まりますか?

既知のスカラーや構造体なら既定でポインタを使い、nullしかなければanyです。スライスとマップはnilを表せるため追加のポインタは不要です。欠落とnullの三状態追跡は行いません。

整数と小数はどんな型になりますか?

通常の整数表記でint64範囲内ならint64、それ以外はjson.Numberです。小数や指数を一度浮動小数点へ変換してから判定することはありません。

配列内で同じキーの型が違うときは?

同じ位置に文字列と数値など互換性のない値があればanyになります。配列内の全要素を調べるので、後から出る異なる型も結果に含まれます。

JSONからstructを生成すると何が楽になりますか?

JSONからGo構造体への変換で、公開フィールド名、元キーのタグ、ネストの宣言をまとめて下書きできます。ただし必須条件や業務ルールは自分のプロジェクトで検証してください。

見直したい推論例がありますか?

実際のレスポンスで試す

JSONからGo構造体を生成し、ポインタ、数値型、日時の選択を確認してからファイルを保存し、プロジェクトで検証してください。