]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.11] encoding/json: fix UnmarshalTypeError without field and struc...
authorTaesu Pyo <pyotaesu@gmail.com>
Tue, 28 Aug 2018 15:56:10 +0000 (15:56 +0000)
committerKatie Hockman <katie@golang.org>
Mon, 1 Oct 2018 19:38:15 +0000 (19:38 +0000)
Updates #26444
Updates #27275
Fixes #27318

Change-Id: I9e8cbff79f7643ca8964c572c1a98172b6831730
GitHub-Last-Rev: 7eea2158b67ccab34b45a21e8f4289c36de02d93
GitHub-Pull-Request: golang/go#26719
Reviewed-on: https://go-review.googlesource.com/126897
Reviewed-by: Daniel Martí <mvdan@mvdan.cc>
Run-TryBot: Daniel Martí <mvdan@mvdan.cc>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-on: https://go-review.googlesource.com/138178
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>

src/encoding/json/decode.go
src/encoding/json/decode_test.go

index 0b29249218a32b037ff9f26fd617d118142d3e1d..7d235087e60f4bb998e4c5e862f27990f1b59034 100644 (file)
@@ -672,6 +672,7 @@ func (d *decodeState) object(v reflect.Value) error {
        }
 
        var mapElem reflect.Value
+       originalErrorContext := d.errorContext
 
        for {
                // Read opening " of string key or closing }.
@@ -832,8 +833,7 @@ func (d *decodeState) object(v reflect.Value) error {
                        return errPhase
                }
 
-               d.errorContext.Struct = ""
-               d.errorContext.Field = ""
+               d.errorContext = originalErrorContext
        }
        return nil
 }
@@ -991,7 +991,7 @@ func (d *decodeState) literalStore(item []byte, v reflect.Value, fromQuoted bool
                        if fromQuoted {
                                return fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type())
                        }
-                       return &UnmarshalTypeError{Value: "number", Type: v.Type(), Offset: int64(d.readIndex())}
+                       d.saveError(&UnmarshalTypeError{Value: "number", Type: v.Type(), Offset: int64(d.readIndex())})
                case reflect.Interface:
                        n, err := d.convertNumber(s)
                        if err != nil {
index ab83b81bb39584411ce0b5e260f04d1b8e77f26a..5746ddf9861e7e1f672ad92a5b6479331b868aa9 100644 (file)
@@ -371,6 +371,10 @@ func (b *intWithPtrMarshalText) UnmarshalText(data []byte) error {
        return (*intWithMarshalText)(b).UnmarshalText(data)
 }
 
+type mapStringToStringData struct {
+       Data map[string]string `json:"data"`
+}
+
 type unmarshalTest struct {
        in                    string
        ptr                   interface{}
@@ -401,6 +405,7 @@ var unmarshalTests = []unmarshalTest{
        {in: `"invalid: \uD834x\uDD1E"`, ptr: new(string), out: "invalid: \uFFFDx\uFFFD"},
        {in: "null", ptr: new(interface{}), out: nil},
        {in: `{"X": [1,2,3], "Y": 4}`, ptr: new(T), out: T{Y: 4}, err: &UnmarshalTypeError{"array", reflect.TypeOf(""), 7, "T", "X"}},
+       {in: `{"X": 23}`, ptr: new(T), out: T{}, err: &UnmarshalTypeError{"number", reflect.TypeOf(""), 8, "T", "X"}}, {in: `{"x": 1}`, ptr: new(tx), out: tx{}},
        {in: `{"x": 1}`, ptr: new(tx), out: tx{}},
        {in: `{"x": 1}`, ptr: new(tx), err: fmt.Errorf("json: unknown field \"x\""), disallowUnknownFields: true},
        {in: `{"F1":1,"F2":2,"F3":3}`, ptr: new(V), out: V{F1: float64(1), F2: int32(2), F3: Number("3")}},
@@ -866,6 +871,18 @@ var unmarshalTests = []unmarshalTest{
                err:                   fmt.Errorf("json: unknown field \"extra\""),
                disallowUnknownFields: true,
        },
+       // issue 26444
+       // UnmarshalTypeError without field & struct values
+       {
+               in:  `{"data":{"test1": "bob", "test2": 123}}`,
+               ptr: new(mapStringToStringData),
+               err: &UnmarshalTypeError{Value: "number", Type: reflect.TypeOf(""), Offset: 37, Struct: "mapStringToStringData", Field: "data"},
+       },
+       {
+               in:  `{"data":{"test1": 123, "test2": "bob"}}`,
+               ptr: new(mapStringToStringData),
+               err: &UnmarshalTypeError{Value: "number", Type: reflect.TypeOf(""), Offset: 21, Struct: "mapStringToStringData", Field: "data"},
+       },
 }
 
 func TestMarshal(t *testing.T) {