diff --git a/src/encoding/json/decode.go b/src/encoding/json/decode.go index cab4616ba3..6608415e13 100644 --- a/src/encoding/json/decode.go +++ b/src/encoding/json/decode.go @@ -786,7 +786,7 @@ func (d *decodeState) object(v reflect.Value) error { n, err := strconv.ParseInt(s, 10, 64) if err != nil || reflect.Zero(kt).OverflowInt(n) { d.saveError(&UnmarshalTypeError{Value: "number " + s, Type: kt, Offset: int64(start + 1)}) - return nil + break } kv = reflect.ValueOf(n).Convert(kt) case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: @@ -794,14 +794,16 @@ func (d *decodeState) object(v reflect.Value) error { n, err := strconv.ParseUint(s, 10, 64) if err != nil || reflect.Zero(kt).OverflowUint(n) { d.saveError(&UnmarshalTypeError{Value: "number " + s, Type: kt, Offset: int64(start + 1)}) - return nil + break } kv = reflect.ValueOf(n).Convert(kt) default: panic("json: Unexpected key type") // should never occur } } - v.SetMapIndex(kv, subv) + if kv.IsValid() { + v.SetMapIndex(kv, subv) + } } // Next token must be , or }. diff --git a/src/encoding/json/decode_test.go b/src/encoding/json/decode_test.go index 5fbe67a706..70731a62d6 100644 --- a/src/encoding/json/decode_test.go +++ b/src/encoding/json/decode_test.go @@ -554,6 +554,16 @@ var unmarshalTests = []unmarshalTest{ ptr: new(map[uint8]string), err: &UnmarshalTypeError{Value: "number -1", Type: reflect.TypeOf(uint8(0)), Offset: 2}, }, + { + in: `{"F":{"a":2,"3":4}}`, + ptr: new(map[string]map[int]int), + err: &UnmarshalTypeError{Value: "number a", Type: reflect.TypeOf(int(0)), Offset: 7}, + }, + { + in: `{"F":{"a":2,"3":4}}`, + ptr: new(map[string]map[uint]int), + err: &UnmarshalTypeError{Value: "number a", Type: reflect.TypeOf(uint(0)), Offset: 7}, + }, // Map keys can be encoding.TextUnmarshalers. {in: `{"x:y":true}`, ptr: &ummapType, out: ummapXY},