mirror of
https://github.com/golang/go
synced 2024-11-21 21:14:47 -07:00
encoding/json: add embedded structs to the UnmarshalTypeError's Field
Including embedded struct inforamtion in error message.
Fixes #68941
Change-Id: I6a6f7d506104839a9a7cf1a2c3003272f5534a79
GitHub-Last-Rev: 717f680aca
GitHub-Pull-Request: golang/go#68966
Reviewed-on: https://go-review.googlesource.com/c/go/+/606956
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Auto-Submit: Ian Lance Taylor <iant@google.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
This commit is contained in:
parent
3da6c94d5e
commit
0fe6347732
1
doc/next/6-stdlib/99-minor/encoding/json/68941.md
Normal file
1
doc/next/6-stdlib/99-minor/encoding/json/68941.md
Normal file
@ -0,0 +1 @@
|
||||
[UnmarshalTypeError.Field] now includes embedded structs to provide more detailed error messages.
|
@ -127,7 +127,7 @@ type UnmarshalTypeError struct {
|
||||
Type reflect.Type // type of Go value it could not be assigned to
|
||||
Offset int64 // error occurred after reading Offset bytes
|
||||
Struct string // name of the struct type containing the field
|
||||
Field string // the full path from root node to the field
|
||||
Field string // the full path from root node to the field, include embedded struct
|
||||
}
|
||||
|
||||
func (e *UnmarshalTypeError) Error() string {
|
||||
@ -701,7 +701,10 @@ func (d *decodeState) object(v reflect.Value) error {
|
||||
if f != nil {
|
||||
subv = v
|
||||
destring = f.quoted
|
||||
for _, i := range f.index {
|
||||
if d.errorContext == nil {
|
||||
d.errorContext = new(errorContext)
|
||||
}
|
||||
for i, ind := range f.index {
|
||||
if subv.Kind() == reflect.Pointer {
|
||||
if subv.IsNil() {
|
||||
// If a struct embeds a pointer to an unexported type,
|
||||
@ -721,13 +724,16 @@ func (d *decodeState) object(v reflect.Value) error {
|
||||
}
|
||||
subv = subv.Elem()
|
||||
}
|
||||
subv = subv.Field(i)
|
||||
if i < len(f.index)-1 {
|
||||
d.errorContext.FieldStack = append(
|
||||
d.errorContext.FieldStack,
|
||||
subv.Type().Field(ind).Name,
|
||||
)
|
||||
}
|
||||
subv = subv.Field(ind)
|
||||
}
|
||||
if d.errorContext == nil {
|
||||
d.errorContext = new(errorContext)
|
||||
}
|
||||
d.errorContext.FieldStack = append(d.errorContext.FieldStack, f.name)
|
||||
d.errorContext.Struct = t
|
||||
d.errorContext.FieldStack = append(d.errorContext.FieldStack, f.name)
|
||||
} else if d.disallowUnknownFields {
|
||||
d.saveError(fmt.Errorf("json: unknown field %q", key))
|
||||
}
|
||||
|
@ -898,6 +898,19 @@ var unmarshalTests = []struct {
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
CaseName: Name(""),
|
||||
in: `{"Level1a": "hello"}`,
|
||||
ptr: new(Top),
|
||||
err: &UnmarshalTypeError{
|
||||
Value: "string",
|
||||
Struct: "Top",
|
||||
Field: "Embed0a.Level1a",
|
||||
Type: reflect.TypeFor[int](),
|
||||
Offset: 10,
|
||||
},
|
||||
},
|
||||
|
||||
// issue 15146.
|
||||
// invalid inputs in wrongStringTests below.
|
||||
{CaseName: Name(""), in: `{"B":"true"}`, ptr: new(B), out: B{true}, golden: true},
|
||||
|
Loading…
Reference in New Issue
Block a user