JSON → Go struct 変換ツール
JSONをjsonタグ付きのGoのstructに変換し、encoding/json用のUnmarshal・Marshalヘルパーも生成します。
JSONからjsonタグ付きのGo structを生成
Goでは、デコードしたいJSONオブジェクトごとにstructが必要で、キーとGoのフィールド名が一致しない場合は各フィールドにjsonタグを付けなければなりません。このツールはそうしたstructを自動で書き出します。allowed_originsのようなsnake_caseのキーはAllowedOriginsのようなエクスポートフィールドになり、対応するjsonタグが付きます。ネストしたオブジェクトは別のstruct型になり、整数はint64、小数はfloat64になります。さらに標準のencoding/jsonパッケージを使ったUnmarshal関数とMarshalメソッドも追加されるため、サードパーティの依存関係は必要ありません。
使い方
- 設定ファイルやAPIレスポンスなどのJSONサンプルを貼り付けます。
- ルートstructの名前を入力します(例: ServerConfig)。
- コードを.goファイルにコピーし、package mainを自分のパッケージ名に変更したうえで、json.Unmarshalまたは生成されたUnmarshal関数でデコードします。
よくある質問
- 数値がintではなくint64で生成されるのはなぜですか?
- JSONの整数にはサイズの上限がないため、どのプラットフォームでも安全なint64を採用しています。値の範囲がわかっている場合は、コピー後にフィールドをintに変更してかまいません。
- jsonタグにomitemptyを付けるにはどうすればよいですか?
- 生成ツールはサンプルのキーに合わせたシンプルなタグを書き出します。Marshal時に空なら省略したいフィールドには、手動で,omitemptyを追加してください。デコードの動作はどちらでも変わりません。
- nullになり得るフィールドや欠落するフィールドはどう扱われますか?
- サンプルでフィールドがnullになっている場合や、配列の一部の要素で欠落している場合は、*stringのようなポインタ型として生成されます。これにより、値が存在しないのか空なのかを区別できます。
例: JSONからGoへの変換
入力JSON
{
"host": "0.0.0.0",
"port": 8080,
"debug": false,
"allowed_origins": ["https://jsonkit.org"],
"database": { "dsn": "postgres://localhost/app", "max_conns": 20 }
}生成されたGo(ServerConfig)
// Code generated from JSON Schema using quicktype. DO NOT EDIT.
// To parse and unparse this JSON data, add this code to your project and do:
//
// serverConfig, err := UnmarshalServerConfig(bytes)
// bytes, err = serverConfig.Marshal()
package main
import "encoding/json"
func UnmarshalServerConfig(data []byte) (ServerConfig, error) {
var r ServerConfig
err := json.Unmarshal(data, &r)
return r, err
}
func (r *ServerConfig) Marshal() ([]byte, error) {
return json.Marshal(r)
}
type ServerConfig struct {
Host string `json:"host"`
Port int64 `json:"port"`
Debug bool `json:"debug"`
AllowedOrigins []string `json:"allowed_origins"`
Database Database `json:"database"`
}
type Database struct {
DSN string `json:"dsn"`
MaxConns int64 `json:"max_conns"`
}