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メソッドも追加されるため、サードパーティの依存関係は必要ありません。

使い方

  1. 設定ファイルやAPIレスポンスなどのJSONサンプルを貼り付けます。
  2. ルートstructの名前を入力します(例: ServerConfig)。
  3. コードを.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"`
}

JSONを他の言語に変換