mirror of
https://github.com/golang/go
synced 2024-11-22 03:54:39 -07:00
json: don't indirect before testing for custom unmarshaler
Fixes #1260. R=gri CC=golang-dev https://golang.org/cl/2994041
This commit is contained in:
parent
9f19392f1a
commit
e9c901dbf4
@ -128,7 +128,9 @@ func (d *decodeState) unmarshal(v interface{}) (err os.Error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
d.scan.reset()
|
d.scan.reset()
|
||||||
d.value(pv.Elem())
|
// We decode rv not pv.Elem because the Unmarshaler interface
|
||||||
|
// test must be applied at the top level of the value.
|
||||||
|
d.value(rv)
|
||||||
return d.savedError
|
return d.savedError
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,6 +23,24 @@ type tx struct {
|
|||||||
|
|
||||||
var txType = reflect.Typeof((*tx)(nil)).(*reflect.PtrType).Elem().(*reflect.StructType)
|
var txType = reflect.Typeof((*tx)(nil)).(*reflect.PtrType).Elem().(*reflect.StructType)
|
||||||
|
|
||||||
|
// A type that can unmarshal itself.
|
||||||
|
|
||||||
|
type unmarshaler struct {
|
||||||
|
T bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *unmarshaler) UnmarshalJSON(b []byte) os.Error {
|
||||||
|
*u = unmarshaler{true} // All we need to see that UnmarshalJson is called.
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
um0, um1 unmarshaler // target2 of unmarshaling
|
||||||
|
ump = &um1
|
||||||
|
umtrue = unmarshaler{true}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
type unmarshalTest struct {
|
type unmarshalTest struct {
|
||||||
in string
|
in string
|
||||||
ptr interface{}
|
ptr interface{}
|
||||||
@ -56,6 +74,10 @@ var unmarshalTests = []unmarshalTest{
|
|||||||
{pallValueCompact, new(All), pallValue, nil},
|
{pallValueCompact, new(All), pallValue, nil},
|
||||||
{pallValueIndent, new(*All), &pallValue, nil},
|
{pallValueIndent, new(*All), &pallValue, nil},
|
||||||
{pallValueCompact, new(*All), &pallValue, nil},
|
{pallValueCompact, new(*All), &pallValue, nil},
|
||||||
|
|
||||||
|
// unmarshal interface test
|
||||||
|
{`{"T":false}`, &um0, umtrue, nil}, // use "false" so test will fail if custom unmarshaler is not called
|
||||||
|
{`{"T":false}`, &ump, &umtrue, nil},
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestMarshal(t *testing.T) {
|
func TestMarshal(t *testing.T) {
|
||||||
|
Loading…
Reference in New Issue
Block a user