KDOC 712: Goのjson.Unmarshalは構造体にないキーを黙って捨てる

この文書のステータス

  • 作成
    • 2026-10-18 貴島
  • レビュー
    • 2026-10-18 貴島

概要

Goの json.Unmarshal は、JSONに構造体のフィールドと対応しないキーがあっても、エラーにせず黙って捨てる。キーの綴りを間違えても気づけない。検知したいときは json.Decoder の DisallowUnknownFields を使う。

package main

import (
	"bytes"
	"encoding/json"
	"fmt"
)

type User struct {
	Name string
}

func main() {
	data := []byte(`{"Name": "a", "Age": 20}`)

	var u1 User
	err := json.Unmarshal(data, &u1)
	fmt.Printf("Unmarshal: %+v, err: %v\n", u1, err)

	var u2 User
	dec := json.NewDecoder(bytes.NewReader(data))
	dec.DisallowUnknownFields()
	err = dec.Decode(&u2)
	fmt.Printf("DisallowUnknownFields: %+v, err: %v\n", u2, err)
}
Unmarshal: {Name:a}, err: <nil>
DisallowUnknownFields: {Name:a}, err: json: unknown field "Age"
go version
go doc encoding/json | grep -A2 'unknown keys in the JSON object'
go version go1.26.7 linux/amd64
  - When parsing a JSON object into a Go struct, unknown keys in the JSON object
    are ignored (unless a Decoder is used and Decoder.DisallowUnknownFields has
    been called).

関連