From 11c1cce0d8443972af23f9bfc33875374f2153a7 Mon Sep 17 00:00:00 2001 From: Tao Wen Date: Thu, 4 Jan 2018 16:19:26 +0800 Subject: [PATCH] fix #217 when input is null, non-decodable type should not be considered as error, to be compatible with stdlib --- feature_reflect_native.go | 4 ++++ jsoniter_invalid_test.go | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/feature_reflect_native.go b/feature_reflect_native.go index 95bd1e8..089c880 100644 --- a/feature_reflect_native.go +++ b/feature_reflect_native.go @@ -382,6 +382,10 @@ type nonEmptyInterfaceCodec struct { } func (codec *nonEmptyInterfaceCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { + if iter.WhatIsNext() == NilValue { + iter.skipFourBytes('n', 'u', 'l', 'l') + return + } nonEmptyInterface := (*nonEmptyInterface)(ptr) if nonEmptyInterface.itab == nil { iter.ReportError("read non-empty interface", "do not know which concrete type to decode to") diff --git a/jsoniter_invalid_test.go b/jsoniter_invalid_test.go index 8af92c5..a9f3342 100644 --- a/jsoniter_invalid_test.go +++ b/jsoniter_invalid_test.go @@ -191,3 +191,10 @@ func TestEOF(t *testing.T) { err := ConfigCompatibleWithStandardLibrary.NewDecoder(&bytes.Buffer{}).Decode(&s) assert.Equal(t, io.EOF, err) } + +func TestDecodeErrorType(t *testing.T) { + should := require.New(t) + var err error + should.Nil(Unmarshal([]byte("null"), &err)) + should.NotNil(Unmarshal([]byte("123"), &err)) +}