JSONのエンコードとデコード
Marshal、Unmarshal、構造体タグ
「JSONのエンコードとデコード」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。
encoding/json の概要
Go の encoding/json パッケージは、構造体タグとリフレクションを使って、Go の値を JSON にマーシャルし、JSON を Go の値にアンマーシャルします。
json.Marshal
json.Marshal は Go の値を JSON のバイト列に変換します。サポートされていない型(チャネル、関数、複素数など)ではエラーを返します。
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}
u := User{Name: "Alice", Age: 30}
data, err := json.Marshal(u)
fmt.Println(string(data)) // {"name":"Alice","age":30}json.Unmarshal
json.Unmarshal は JSON を Go の値にデコードします。対象にはポインターを指定する必要があります。
var u User
err := json.Unmarshal(data, &u)
fmt.Println(u.Name) // "Alice"構造体タグ
json: 構造体タグを使うと、フィールド名の制御、空の値の省略、エクスポートされていないフィールドの除外ができます。
type Product struct {
ID int `json:"id"`
Price float64 `json:"price,omitempty"` // omit if zero
secret string // unexported: ignored
}json.Encoder / json.Decoder
ストリーミング(HTTP のレスポンスボディやリクエストボディ)には、Encoder と Decoder を使用します。Marshal/Unmarshal と異なり、ペイロード全体をメモリに読み込まずに済みます。
// Writing
json.NewEncoder(w).Encode(user)
// Reading
var u User
json.NewDecoder(r.Body).Decode(&u)map[string]any へのデコード
未知の JSON を汎用マップにデコードします。
var m map[string]any
json.Unmarshal(data, &m)
fmt.Println(m["name"])json.Number
デフォルトでは、汎用マップ内の数値は float64 としてデコードされます。decoder.UseNumber() を使用すると、精度を維持したまま json.Number としてデコードできます。
dec := json.NewDecoder(r)
dec.UseNumber()
var m map[string]any
dec.Decode(&m)カスタムマーシャリング
json.Marshaler または json.Unmarshaler を実装すると、型のエンコードやデコードを制御できます。たとえば、日付のカスタム形式に使用できます。
func (d Date) MarshalJSON() ([]byte, error) {
return json.Marshal(d.Format("2006-01-02"))
}フィールドの省略
omitempty を使用すると、ゼロ値を省略できます。json:"-" を使用すると、値にかかわらず JSON 出力から常にフィールドを除外できます。
Hidden string `json:"-"`null の処理
JSON の null をアンマーシャルすると、スカラー値では Go のゼロ値になり、ポインターでは nil が設定されます。nil ポインターをマーシャルすると null になります。
整形出力
人間が読みやすい出力には、json.MarshalIndent を使用します。
data, _ := json.MarshalIndent(u, "", " ")クイックチェック
`json:"name,omitempty"` という構造体タグは何をしますか。
まとめ: JSON のエンコードとデコード
要点:
- メモリ上のデータには json.Marshal/Unmarshal、ストリームには Encoder/Decoder を使用します
- 構造体タグで名前、omitempty、除外を制御します
- カスタム型では Marshaler/Unmarshaler を実装します
- デバッグ出力には json.MarshalIndent を使用します
よくある質問
「JSONのエンコードとデコード」レッスンは無料ですか?
はい。「JSONのエンコードとデコード」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。
「JSONのエンコードとデコード」で何を学びますか?
Marshal、Unmarshal、構造体タグ ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Go Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「JSONのエンコードとデコード」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このGo Academyレッスンでコードを書いて実行できますか?
はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- osとbufioによるファイル読み込み
- ファイルと一時ファイルへの書き込み
- JSONのエンコードとデコード
- JSONとCSVのストリーミング