Caution

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

  1. トップページ
  2. Go辞典
  3. json.Marshal() / Unmarshal()

json.Marshal() / Unmarshal()

GoとJSONを相互変換する際は『encoding/json』パッケージを使います。『json.Marshal()』でGoの値をJSON文字列に、『json.Unmarshal()』でJSONをGoの値に変換できます。

構文
// GoのデータをJSONバイトスライスに変換する
data, err := json.Marshal(値)

// JSONバイトスライスをGoのデータに変換する(v はポインタを渡す)
err := json.Unmarshal(jsonバイトスライス, &v)

// 構造体のフィールドにJSONタグを付ける
type User struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}
関数一覧
関数概要
json.Marshal(v)Goの値をJSONエンコードしたバイトスライスを返します。
json.MarshalIndent(v, prefix, indent)インデント付きで整形されたJSONを返します。デバッグや出力確認に便利です。
json.Unmarshal(data, v)JSONバイトスライスをデコードして v に格納します。v にはポインタを渡します。
サンプルコード
package main

import (
	"encoding/json"
	"fmt"
)

// JSONタグで出力時のキー名を指定する
type User struct {
	Name  string `json:"name"`
	Age   int    `json:"age"`
	Email string `json:"email,omitempty"` // 空なら出力しない
}

func main() {
	// 構造体を JSON に変換する(Marshal)
	user := User{Name: "田中", Age: 30}
	data, err := json.Marshal(user)
	if err != nil {
		fmt.Println("エラー:", err)
		return
	}
	fmt.Println("JSON:", string(data))

	// 整形して出力する(MarshalIndent)
	pretty, _ := json.MarshalIndent(user, "", "  ")
	fmt.Println("整形JSON:\n", string(pretty))

	// JSON から構造体に変換する(Unmarshal)
	jsonStr := `{"name":"佐藤","age":25,"email":"sato@example.com"}`
	var decoded User
	err = json.Unmarshal([]byte(jsonStr), &decoded)
	if err != nil {
		fmt.Println("デコードエラー:", err)
		return
	}
	fmt.Printf("デコード結果: %+v\n", decoded)

	// マップ型でJSONを受け取る(構造が不定な場合)
	var m map[string]interface{}
	json.Unmarshal([]byte(jsonStr), &m)
	fmt.Println("名前:", m["name"])
}
概要

JSONタグ(バッククォートで囲んだ『`json:"name"`』)を使うと、GoのフィールドとJSONキーの名前を対応付けられます。タグがない場合はフィールド名がそのまま使われます。

『json.Unmarshal()』の第2引数には必ずポインタを渡してください。ポインタでない値を渡すと実行時エラーになります。また、JSONのデコード先の構造体フィールドは大文字(エクスポートされている)である必要があります。小文字のフィールドはJSONに含まれません。大量データの変換には『json.Encoder / Decoder』を使うとメモリ効率が上がります。

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