ツール

JSON → Go 構造体変換ツール

JSON ペイロードを、json タグ付き、null になり得る値はポインター、タイムスタンプは time.Time の Go 構造体に変換します。

ブラウザ内で実行コード変換1.4万
無料

入力

0 B

結果

結果はここに表示されます。

encoding/json でペイロードをアンマーシャルするには、Go 流のフィールド名と、それぞれを元のキーに対応付ける json タグを持つ構造体が先に必要です。このツールは quicktype の Go レンダラーを使い、サンプルからそれらを生成します。stargazers_count は json:"stargazers_count" タグ付きの StargazersCount になり、ネストされたオブジェクトはそれぞれ名前付きの構造体になり、ときどき null になるフィールドはポインターになるので、null とゼロ値を区別できます。出力は package 句と使用する import から始まる完全な Go ファイルです。プロジェクトに追加するときは package main を自分のパッケージ名に変更してください。

動作のしくみ

  • フィールド名は Go の頭字語の慣習に従うため、id は ID に、html_url は HTMLURL になり、リンターが期待する形になります。
  • すべてのサンプルで整数だった数値は int64 になり、小数の値が 1 つでもあればそのフィールドは float64 になります。
  • RFC 3339 のタイムスタンプは time.Time 型になり、encoding/json がカスタムコードなしでパースします。文字列のままにしたい場合は日付の検出をオフにしてください。
  • omitempty オプションはすべてのタグに ,omitempty を付けるため、構造体を JSON にマーシャルし直すときにゼロ値が省かれます。

データの行き先

どこにも行きません。このツールは完全にブラウザ内で動作します。貼り付けたテキストはページが処理し、サーバーに送信されることも、ログに記録されることもありません。

このツールは無料で登録不要です。結果は開いているページの中にだけあり、どこにも保存されません。

必要なポイント

このツールは無料です。ログインもポイントも必要ありません。

よくある質問

一部のフィールドがポインターになるのはなぜですか?
Go では、「存在しない、または null」とゼロ値を区別する手段がポインターだからです。GitHub のサンプルにある homepage は、一方のリポジトリでは文字列、もう一方では null なので *string になります。ただの string にすると null が空文字列になってしまい、2 つのケースを区別できなくなります。
interface{} 型になるフィールドがあるのはなぜですか?
サンプルの値がすべて null だと推論できる型がないため、何でも受け付ける interface{} のままにしています。実際の型がわかったら置き換えるか、そのフィールドに値が入ったサンプルを含めて生成し直してください。
mholt/json-to-go と同じものですか?
やることは同じです。Matt Holt の json-to-go は、この用途で長く使われてきたブラウザツールです。ただしこちらのエンジンは quicktype で、同一の形を 1 つの構造体にまとめ、配列の要素を比較して省略可能なフィールドを判定します。出力のスタイルは十分に近いので、どちらで生成した構造体も同じコードベースになじみます。
omitempty はオンにすべきですか?
空の値が本当に「省略する」ことを意味する場合だけにしてください。omitempty を付けると、マーシャル時に false、0、空文字列が消えるため、false と未指定を区別する API にはリクエストが違う意味で読まれてしまいます。アンマーシャル先としてしか使わない構造体なら、このタグは何も変えません。

背後にあるオープンソース

このツールは glideapps/quicktype(Apache-2.0)の上で動作しています。同じ処理を自分のプログラムに組み込みたい場合は、そのライブラリを使ってください。

glideapps/quicktype

別の呼び方

  • json go 変換
  • json go 構造体 変換
  • golang struct 生成
  • json struct 変換 オンライン
  • go json タグ
  • json golang 変換