ネストされた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" という名前)、コンバーターは親名を付加して UserDataOrderData のような型を生成します。

ネストされたデータのアンマーシャリング

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構造体に変換することで、コンパイル時の型チェックによるレスポンスの安全なトラバースが可能になります。

試してみる — JSON to Go Struct Converter

フルツールを開く