スキップしてメイン コンテンツに移動

Go初心者のJSONタグ活用

Go初心者のJSONタグ活用

Go初心者のためのJSON操作入門

Go言語でデータ交換を行う際、JSONは最も一般的なフォーマットです。Go初心者がJSON操作を始めるには、まず標準ライブラリのencoding/jsonパッケージを理解することが重要です。このパッケージは、構造体をJSON文字列に変換したり、逆にJSON文字列を構造体に変換したりする機能を提供します。

JSON操作の基本は「シリアライズ」と「デシリアライズ」です。シリアライズは構造体をJSON文字列に変換するプロセスで、デシリアライズはJSON文字列を構造体に戻すプロセスです。Goではそれぞれjson.Marshaljson.Unmarshalという関数で実装されています。

APIを呼び出す際に送受信するデータはJSONで表現されることが多く、GoでAPIを扱う場合はJSON操作が必須になります。以下では具体的なコード例を通じて、JSON操作の流れを解説します。

json.Marshalとjson.Unmarshalの使い方

まず、json.Marshalを使って構造体をJSON文字列に変換する例です。構造体にjsonタグを付けることで、フィールド名の変換やスキップの指定ができます。

type User struct {
    ID   int    `json:"id"`
    Name string `json:"name"`
    Age  int    `json:"age,omitempty"`
}
u := User{ID: 1, Name: "Alice", Age: 0}
data, err := json.Marshal(u)
if err != nil {
    log.Fatal(err)
}
fmt.Println(string(data)) // {"id":1,"name":"Alice"}

次に、json.UnmarshalでJSON文字列を構造体に戻す例です。JSONのキーと構造体のフィールド名が一致しない場合は、jsonタグでマッピングします。

var u User
err := json.Unmarshal(data, &u)
if err != nil {
    log.Fatal(err)
}
fmt.Printf("%+v\n", u) // {ID:1 Name:Alice Age:0}

APIから取得したJSONレスポンスを構造体にデシリアライズする際は、上記の手順を踏むだけで簡単にデータを扱えます。エラー処理を忘れずに行い、JSONの構造が変わった場合に備えてタグを見直すことも重要です。

構造体タグでシリアライズ・デシリアライズをカスタマイズ

構造体タグはJSON操作を柔軟にするための強力なツールです。omitemptyを使うと、ゼロ値のフィールドをJSONから除外できます。また、stringタグを付けると、数値を文字列として扱うことができます。

type Product struct {
    ID    int     `json:"id"`
    Price float64 `json:"price,string"`
    Tags  []string `json:"tags,omitempty"`
}
p := Product{ID: 101, Price: 19.99}
data, _ := json.Marshal(p)
fmt.Println(string(data)) // {"id":101,"price":"19.99"}

さらに、json:"-"タグを付けると、そのフィールドはシリアライズ・デシリアライズの対象外になります。これを利用して、内部でのみ使用するデータをJSONに含めないようにできます。

API設計時にJSONの構造を決める際は、クライアント側の期待とサーバー側の実装を合わせるために、タグを正しく設定することが不可欠です。タグを活用すれば、データ交換の際に余計な情報を送らず、通信量を削減できます。

この記事はAIによって作成されました。

コメント