jsonpb: Reject unknown fields when parsing into a struct.
This follows the proto3 JSON spec, and seems wise anyway.
diff --git a/jsonpb/jsonpb.go b/jsonpb/jsonpb.go
index f3e53d4..65d0335 100644
--- a/jsonpb/jsonpb.go
+++ b/jsonpb/jsonpb.go
@@ -207,7 +207,7 @@
}
// Handle maps.
- // NOTE: Since Go randomizes map iteration, we sort keys for stable output.
+ // Since Go randomizes map iteration, we sort keys for stable output.
if v.Kind() == reflect.Map {
out.write(`{`)
keys := v.MapKeys()
@@ -320,8 +320,18 @@
if err := unmarshalValue(target.Field(i), valueForField); err != nil {
return err
}
+ delete(jsonFields, fieldName)
}
}
+ if len(jsonFields) > 0 {
+ // Pick any field to be the scapegoat.
+ var f string
+ for fname := range jsonFields {
+ f = fname
+ break
+ }
+ return fmt.Errorf("unknown field %q in %v", f, targetType)
+ }
return nil
}
@@ -389,6 +399,7 @@
// parseFieldOptions returns the field name and if it should be omited.
func parseFieldOptions(f reflect.StructField) (string, bool) {
+ // TODO: Do this without using the "json" field tag.
name := f.Name
omitEmpty := false
tag := f.Tag.Get("json")