Description
Currently, json.Unmarshal (and json.Decoder.Decode) ignore fields in the incoming JSON which are absent in a target struct.
For example, the JSON { "A": true, "B": 123 }
will successfully unmarshal into struct { A bool }
.
This makes it difficult to do strict JSON parsing. One place this is an issue is in API creation, since you want to reject unknown fields on incoming JSON requests to allow safe introduction of new fields in the future (I've had this use case previously when working on a JSON REST API). It also can lead to typos leading to bugs in production: when a field is almost always the zero value in incoming JSON, you might not realise you're not even reading a misspelled field.
I propose that a new method is added to Decoder
to turn on this stricter parsing, in much the same way UseNumber
is used today. When in strict parsing mode, a key in the incoming JSON which cannot be applied to a struct will result in an MissingFieldError
error. Like UnmarshalTypeError
, decoding would continue for the remaining incoming data.
d := json.NewDecoder(r.Body)
d.UseStrictFields()
err := d.Decode(myStruct)