動的なJSONキーをGoのmap型で扱う

動的または未知のキーを持つJSONオブジェクトをGoのmap[string]interface{}およびmap[string]T型に変換します。型アサーションとイテレーションパターンを解説。

Advanced Types

詳細な説明

GoマップによるJSONの動的キーの処理

JSONオブジェクトのキーがコンパイル時に不明な場合、構造体を定義できません。代わりに、Goの map 型を使用します。

JSONの例

{
  "metrics": {
    "cpu_usage": 72.5,
    "memory_usage": 85.3,
    "disk_io": 45.1
  },
  "labels": {
    "env": "production",
    "region": "us-east-1",
    "team": "backend"
  }
}

生成されるGo構造体

type AutoGenerated struct {
    Metrics map[string]float64 `json:"metrics"`
    Labels  map[string]string  `json:"labels"`
}

値の型が混在する場合

値が均一でない場合は、map[string]interface{}(Go 1.18以降では map[string]any)を使用します:

{
  "settings": {
    "theme": "dark",
    "fontSize": 14,
    "autoSave": true
  }
}
type Config struct {
    Settings map[string]interface{} `json:"settings"`
}

型アサーション

interface{} 値を使用する場合、基底型にアクセスするために型アサーションが必要です:

if theme, ok := config.Settings["theme"].(string); ok {
    fmt.Println("Theme:", theme)
}

マップのイテレーション

for key, value := range response.Metrics {
    fmt.Printf("%s: %.1f\n", key, value)
}

構造体 vs マップの判断

キーが既知で固定の場合は構造体を使用します。キーが動的、ユーザー定義、またはレスポンス間で異なる場合はマップを使用します。実際には多くのAPIが両方を組み合わせています — 固定フィールドは構造体フィールドとして、動的フィールドはマップとして。

ユースケース

モニタリングダッシュボード、フィーチャーフラグシステム、キーバリューストアは予測不可能なキーを持つJSONを返します。Goマップを使えば、コンパイル時に正確なキー名を知らなくてもこれらを処理できます。

試してみる — JSON to Go Struct Converter

フルツールを開く