Skip to content

Commit

Permalink
encoding/json: fix UnmarshalTypeError without field & struct values
Browse files Browse the repository at this point in the history
  • Loading branch information
bigflood committed Jul 31, 2018
1 parent 1a5350e commit 37213aa
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 3 deletions.
6 changes: 3 additions & 3 deletions src/encoding/json/decode.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 }.
Expand Down Expand Up @@ -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
}
Expand Down Expand Up @@ -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())}
return d.addErrorContext(&UnmarshalTypeError{Value: "number", Type: v.Type(), Offset: int64(d.readIndex())})
case reflect.Interface:
n, err := d.convertNumber(s)
if err != nil {
Expand Down
16 changes: 16 additions & 0 deletions src/encoding/json/decode_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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{}
Expand Down Expand Up @@ -866,6 +870,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) {
Expand Down

0 comments on commit 37213aa

Please sign in to comment.