Go JSON: Struct Tags と Marshal の実践ポイント

2025-01-30

Go では JSON を struct と tag でマッピングします。タグの設計ミスや omitempty の理解不足が API 不整合の原因になりがちです。

Struct tags

json:"name,omitempty" でキー名と省略挙動を定義し、非公開フィールドは対象外です。

type User struct {
  ID   int    `json:"id"`
  Name string `json:"name,omitempty"`
}

Unmarshal

interface{} の数値は float64 になるため、厳密化には json.Number や構造体を使います。

json.RawMessage

内側 JSON を後段で解析したいときに有効で、ポリモーフィック payload に向きます。

Marshal

反射ベース実装のため hot path では最適化検討が必要ですが、多くは標準実装で十分です。