diff --git a/feature_reflect_native.go b/feature_reflect_native.go index 7e2e6a8..065b43b 100644 --- a/feature_reflect_native.go +++ b/feature_reflect_native.go @@ -618,6 +618,8 @@ func (decoder *unmarshalerDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { templateInterface.word = ptr realInterface := (*interface{})(unsafe.Pointer(&templateInterface)) unmarshaler := (*realInterface).(json.Unmarshaler) + iter.nextToken() + iter.unreadByte() // skip spaces bytes := iter.SkipAndReturnBytes() err := unmarshaler.UnmarshalJSON(bytes) if err != nil { diff --git a/jsoniter_customize_test.go b/jsoniter_customize_test.go index 30bec4f..2ae0e67 100644 --- a/jsoniter_customize_test.go +++ b/jsoniter_customize_test.go @@ -180,26 +180,22 @@ func Test_marshaler_and_encoder(t *testing.T) { type ObjectImplementedUnmarshaler int -func (obj *ObjectImplementedUnmarshaler) UnmarshalJSON([]byte) error { - *obj = 100 +func (obj *ObjectImplementedUnmarshaler) UnmarshalJSON(s []byte) error { + val, _ := strconv.ParseInt(string(s[1:len(s)-1]), 10, 64) + *obj = ObjectImplementedUnmarshaler(val) return nil } func Test_unmarshaler(t *testing.T) { - type TestObject struct { - Field *ObjectImplementedUnmarshaler - Field2 string - } should := require.New(t) - obj := TestObject{} - val := ObjectImplementedUnmarshaler(0) - obj.Field = &val - err := json.Unmarshal([]byte(`{"Field":"hello"}`), &obj) + var obj ObjectImplementedUnmarshaler + err := json.Unmarshal([]byte(` "100" `), &obj) should.Nil(err) - should.Equal(100, int(*obj.Field)) - err = Unmarshal([]byte(`{"Field":"hello"}`), &obj) + should.Equal(100, int(obj)) + iter := ParseString(ConfigDefault, ` "100" `) + iter.ReadVal(&obj) should.Nil(err) - should.Equal(100, int(*obj.Field)) + should.Equal(100, int(obj)) } func Test_unmarshaler_and_decoder(t *testing.T) {