ネストされたJSONオブジェクトからGo構造体への変換
ネストされたオブジェクトを含むJSONを内部構造体型を持つGo構造体に変換します。Goが階層的なJSONデータを適切な型定義で処理する方法を学びます。
Basic Structs
詳細な説明
GoでのネストされたJSONオブジェクトの処理
実際のJSONにはほぼ必ずネストされたオブジェクトが含まれます。Goでは、各ネストされたオブジェクトが独自の構造体型になり、親構造体がその型のフィールドを保持します。
JSONの例
{
"user": {
"name": "Bob",
"age": 30,
"address": {
"street": "123 Main St",
"city": "Springfield",
"zip": "62704"
}
}
}
生成されるGo構造体
type AutoGenerated struct {
User User `json:"user"`
}
type User struct {
Name string `json:"name"`
Age int `json:"age"`
Address Address `json:"address"`
}
type Address struct {
Street string `json:"street"`
City string `json:"city"`
Zip string `json:"zip"`
}
ネストの仕組み
GoはTypeScriptのような匿名インラインオブジェクト型をサポートしていません。ネストされたJSONオブジェクトごとに名前付き構造体型が必要です。コンバーターはネストの各レベルに対して別々の構造体を生成し、親キーに基づいて命名します。
命名規則
JSONキーが "address" の場合、構造体型は Address になります。命名の衝突がある場合(2つの異なるオブジェクトが同じ "data" という名前)、コンバーターは親名を付加して UserData や OrderData のような型を生成します。
ネストされたデータのアンマーシャリング
var response AutoGenerated
json.Unmarshal([]byte(jsonData), &response)
fmt.Println(response.User.Address.City) // "Springfield"
Goの encoding/json パッケージは各ネストされたオブジェクトを再帰的に処理し、各レベルでJSONキーを構造体タグにマッチングします。これにより、深くネストされた構造も標準のドット記法で完全にナビゲート可能になります。
ユースケース
Stripe、GitHub、TwilioなどのサービスのAPIは、深くネストされたJSONレスポンスを頻繁に返します。これらをネストされたGo構造体に変換することで、コンパイル時の型チェックによるレスポンスの安全なトラバースが可能になります。