JSON→Go構造体
JSONのサンプルを貼り付けると、encoding/jsonできれいに解析できるGoの構造体定義が得られます。フィールドはエクスポートされ(CamelCase)、元のJSONキーでタグ付けされ、値がnullになり得る場合はポインターに昇格し、ネストされたオブジェクトはそれぞれ名前付きの構造体宣言を得ます。
JSONをGo構造体に変換する方法
-
1
JSONを貼り付ける
単一のサンプルで十分です。複数のサンプルはnullable推論を改善します。
-
2
命名を選ぶ
エクスポートされたフィールドのPascalCaseがGoの慣習です。略語のスタイル(`URL` vs `Url`、`ID` vs `Id`)を選びます。
-
3
オプショナルの戦略を選ぶ
nullableなフィールドにポインターを使う(最も慣用的)か、`omitempty`タグを使います。
-
4
構造体をコピー
1つのルート構造体とネストされたもの。`.go`ファイルに貼り付けて`go build`を実行します。
出力例
入力:
{ "first_name": "Alice", "age": 30, "email": null, "tags": ["admin"] }
出力:
type User struct {
FirstName string `json:"first_name"`
Age int `json:"age"`
Email *string `json:"email"`
Tags []string `json:"tags"`
}
型のマッピング
| JSONの値 | Goの型 |
|---|---|
| 文字列 | string |
| 整数 | int または int64 |
| 数値(小数) | float64 |
| 真偽値 | bool |
| null(非nullの兄弟がある場合) | *T(ポインター) |
| 配列 | []T |
| オブジェクト | 名前付き構造体 |
| 混在した配列 | []interface{} |
ジェネレーターが従う命名の慣用
- 頭字語は大文字化:
id->ID、url->URL、api_key->APIKey。これはGoの推奨スタイル(およびgo vet/staticcheckのルール)に合致します。 - snake_caseのJSON -> PascalCaseのフィールド:
first_name->FirstName。 - 単語1つの頭字語は保持:
IPはIP、HTTPはHTTPのまま。 - JSONタグ:
json:"first_name"は元のキーを保ち、エンコードがきれいに往復します。
オプショナルなフィールド:ポインターかomitemptyか?
| 戦略 | 使うとき |
|---|---|
ポインター(*T) |
「不在」と「ゼロ値」を区別する必要がある |
omitempty |
マーシャル時にゼロ値をスキップしたいだけ。アンマーシャルは欠如にゼロを格納する |
| どちらでもない | フィールドは常に存在し、ゼロ値が意味を持つ |
ジェネレーターは、nullと見なされたものについては既定でポインター+omitemptyにします。セマンティクスに合わせて調整してください。
よくある間違い
- 32ビットのターゲットでJSONの整数が
MaxInt32を超えるのにintを使う。 既知の大きな値にはint64を使ってください。 - マーシャルし直してキーの順序を失う。
encoding/jsonは元のJSONの順序ではなく、フィールド宣言の順序でキーを出力します。正規の出力が必要なら手動で並べ替えてください。 - 形の混在した配列。
[]interface{}は型安全性を失います。代わりにtypeの判別フィールドを持つユニオン型を検討してください。 - オプショナルに
omitemptyを忘れる。 それがないと、オプショナルなフィールドは省略されずに"foo": nullとしてシリアライズされます。
よくある質問
「フィールドの不在」と「フィールドがゼロ」を区別する必要があるときはポインターを使います。ゼロ値が正当な業務上の値でないとき(""、0、falseが常に「これをスキップ」を意味するとき)はomitemptyを使います。多くのチームは1つを選び、コードベース全体で一貫して適用します。
各ネストされたオブジェクトは別の名前付き構造体宣言になります(例:User -> Address)。型がインライン化されるのは、ネストされた構造体が小さく一度しか使われないときだけで、それ以外はきれいで再利用可能な型が得られます。
はい。idはID、urlはURL、api_keyはAPIKeyになります。これはgo vetが期待し、ほとんどのGoのスタイルガイドが推奨するものです。
ジェネレーターは標準のjson:タグを持つ素の構造体を出力します。カスタムのUnmarshalJSONの実装(例:非ISO形式の日付)には、生成後に手動で追加してください。
関連ツール
ASCII表リファレンス
0から127までの完全なASCII表です。NUL、LF、DELなどの制御コードを含め、各文字の10進数、16進数、8進数、2進数、HTML数値文字参照を表示します。
HTML文字参照
HTMLエンティティの検索可能なリスト、その名称コードおよび数値コード、および特殊文字や記号のワンクリックコピー機能を提供します。
キーボードショートカット一覧
macOS、Windows、Linux向けに、VS Code、Chrome、GNU Readlineを使うBashの公式資料に基づく既定ショートカットを検索できます。
EditorConfig ジェネレーター
インデントのスタイルとサイズ、改行コード、文字コード、空白ルールを指定して .editorconfig ファイルを生成し、IDE やエディタをまたいで書式を統一できます。
メールアドレス検証ツール
メールアドレスを検証します。RFC 5322構文チェック、MXレコードのライブ確認に加え、ローカル部、ドメイン、長さの詳細を表示します。メールは送信されません。
Markdownチートシート
見出し、リスト、表、コード、リンク、画像、GFM構文を、実際のプレビューとコピーできる例で確認できる実用的なMarkdownリファレンスです。
このツールは他の言語でも利用できます
- JSON vers Go Struct [FR]
- JSON till Go-struktur [SV]
- JSON เป็นโครงสร้างข้อมูล Go [TH]
- JSON إلى بنية Go [AR]
- JSON ke Struktur Go [ID]
- JSON thành cấu trúc [VI]
- JSON을 Go 구조체로 변환 [KO]
- JSON zu Go Struct [DE]
- JSON a Estructura Go [ES]
- JSON naar Go-structuur [NL]
- JSON na strukturę Go [PL]
- JSON para Estrutura Go [PT]
- JSON в структуру данных [RU]
- JSON'dan Go Yapısına [TR]
- JSON 至Go结构 [ZH]
- JSON to Go Struct [EN]
- JSON in Struttura Go [IT]