Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

  1. トップページ
  2. Go辞典
  3. json.Encoder / Decoder

json.Encoder / Decoder

『json.Encoder』と『json.Decoder』はストリームに対してJSONの読み書きを行います。ファイルやネットワークなどの io.Writer / io.Reader と組み合わせてメモリ効率よく処理できます。

構文
// Encoder を作成して値をJSONとして書き込む
enc := json.NewEncoder(writer)
err := enc.Encode(値)

// Decoder を作成してJSONを読み込んでデコードする
dec := json.NewDecoder(reader)
err := dec.Decode(&v)
関数一覧
関数 / メソッド概要
json.NewEncoder(w)io.Writer をラップした Encoder を作成します。
enc.Encode(v)v をJSONエンコードして Writer に書き込みます。末尾に改行が自動付加されます。
enc.SetIndent(prefix, indent)Encode() の出力をインデント付きに設定します。
json.NewDecoder(r)io.Reader をラップした Decoder を作成します。
dec.Decode(v)Reader からJSONを読み込んで v にデコードします。
dec.More()配列やオブジェクトに次の要素があるか確認します。
サンプルコード
package main

import (
	"encoding/json"
	"fmt"
	"os"
	"strings"
)

type Product struct {
	Name  string  `json:"name"`
	Price float64 `json:"price"`
}

func main() {
	// Encoder で標準出力に直接JSONを書き出す
	enc := json.NewEncoder(os.Stdout)
	enc.SetIndent("", "  ")

	products := []Product{
		{Name: "りんご", Price: 150},
		{Name: "みかん", Price: 80},
	}
	fmt.Println("--- Encoder で出力 ---")
	enc.Encode(products)

	// Decoder でJSON文字列をデコードする
	jsonData := `
		{"name":"ぶどう","price":300}
		{"name":"もも","price":250}
	`
	dec := json.NewDecoder(strings.NewReader(jsonData))

	fmt.Println("--- Decoder で読み込み ---")
	for dec.More() {
		var p Product
		if err := dec.Decode(&p); err != nil {
			fmt.Println("デコードエラー:", err)
			break
		}
		fmt.Printf("%s: %.0f円\n", p.Name, p.Price)
	}
}
実行結果
--- Encoder で出力 ---
[
  {
    "name": "りんご",
    "price": 150
  },
  {
    "name": "みかん",
    "price": 80
  }
]
--- Decoder で読み込み ---
ぶどう: 300円
もも: 250円
概要

『Encoder / Decoder』は io.Writer / io.Reader を直接扱うため、HTTPレスポンスやファイルへの書き込み・読み込みをバッファなしで行えます。大きなJSONデータを扱う場合は『json.Marshal / Unmarshal』よりメモリ効率が良いです。

HTTPハンドラーでJSONを返す場合は『json.NewEncoder(w).Encode(data)』が定番のパターンです。『enc.Encode()』は末尾に自動的に改行を追加します。JSONストリームを厳密に制御したい場合はこの点に注意してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。