本文へスキップ

JSONからGo構造体

JSON to Go Structs

JSONの実例からjsonタグ付きのGoの構造体を作り、入れ子や繰り返しの型も扱います。

例の文書から`json:`タグの付いたGoの構造体を作ります。レスポンスの本文を`encoding/json`がアンマーシャルできる形にします。フィールド名はexportされる形にキャメルケース化し、元のキーはタグに残します。手で書くときにいちばんよく間違えるのがそこです。

🔒 ブラウザの中だけで動きますgojsoncodegenstruct
出力する形式

サンプルJSON

.json ファイルを置く

このタブの中で読みます。アップロードはしません。

手元にある要素を全部入れてください。レコードが一つ増えるたびに推論が絞り込まれます。どれか一つに無いフィールドこそが、省略可能である根拠です。

TypeScript

使い方

  1. 手元にあるレコードをできるだけ多く貼り付けます

    配列は先頭の要素だけでなく、すべての要素を読んで合わせます。レコードが3件あれば1件のときよりはるかに多くのことが分かります。どれか1件に欠けているという事実こそが、そのフィールドを省略可能にする根拠だからです。

  2. ルートの型に名前を付けます

    入れ子のオブジェクトは、それを保持しているキーの名前を取ります。配列なら単数形になるので、`users`からは`User`ができます。自分で名前を決める必要があるのはルートだけです。

  3. 出力の下にある件数を読みます

    型の数、省略可能なフィールドの数、ユニオンの数、そして合わせたレコードの数が出ます。ユニオンが0より大きければ、あるフィールドが標本の中で違う種類の値を持っていたということなので、結果をコードベースに貼り付ける前に一度見ておく価値があります。

  4. 構造体をパッケージに貼り付けます

    一部のレコードに無かったフィールドにはタグに`,omitempty`が付き、マーシャルし直すときに無かった値を作り出さないようにします。package宣言は出しません。どこに置くかは書く人が知っています。

よくある質問

数値がすべてfloat64になるのはなぜですか

そうなるのは標本に小数があったときだけです。文書の中の数値がすべて整数だったなら、整数型として出します。idとして使われたJSONの`1`と、丸められた価格の`1`を見分ける方法はないので、標本があるかぎりの根拠のすべてです。

一部のレコードでnullになるフィールドはどうなりますか

ポインタ型になります。Goで「無い、またはnull」と「ゼロ値」を区別する方法がこれです。そのため、値を取り出すときにはnilの検査が要ります。面倒ではありますが、もう一方の案——黙って0や空文字列として読まれる値型——のほうが悪いからです。

Goの識別子として使えないキーはどうなりますか

フィールド名のほうは区切り文字を落とし、各部分の先頭を大文字にして整えます。元のキーは`json:`タグに残り、実際の対応付けはタグが行います。`user-id`は`json:"user-id"`を付けた`UserId`のような形になります。

`time.Time`のフィールドになりますか

なりません。JSONのタイムスタンプは文字列であり、`time.Time`にするとアンマーシャルが受け付ける範囲が変わります。必要なら手でフィールドの型を変えてください。`encoding/json`はRFC 3339の文字列を`time.Time`として自分でパースします。

ここから渡せます

次の一手

このツールが出したものをそのまま受け取れる道具です。