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).
関連
- 補足: KDOC 444: デコード時の未知のキー混入を防ぐ。未知のキーを検証するべき理由と、TOMLで検証する方法を書いている