0Pricing
Go Academy · レッスン

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. osとbufioによるファイル読み込み
  2. ファイルと一時ファイルへの書き込み
  3. JSONのエンコードとデコード
  4. JSONとCSVのストリーミング
← Go Academyに戻る