From 8f50a91be2301f23677411996e026e4159a065c2 Mon Sep 17 00:00:00 2001 From: Tao Wen Date: Fri, 6 Oct 2017 18:08:14 +0800 Subject: [PATCH] fix #181, support string as json.Number and jsoniter.Number --- feature_reflect_native.go | 12 ++++++++++-- jsoniter_int_test.go | 12 ++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/feature_reflect_native.go b/feature_reflect_native.go index 332b9e0..19b5fa4 100644 --- a/feature_reflect_native.go +++ b/feature_reflect_native.go @@ -441,7 +441,11 @@ type jsonNumberCodec struct { } func (codec *jsonNumberCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { - *((*json.Number)(ptr)) = json.Number([]byte(iter.readNumberAsString())) + if iter.WhatIsNext() == StringValue { + *((*json.Number)(ptr)) = json.Number(iter.ReadString()) + } else { + *((*json.Number)(ptr)) = json.Number([]byte(iter.readNumberAsString())) + } } func (codec *jsonNumberCodec) Encode(ptr unsafe.Pointer, stream *Stream) { @@ -460,7 +464,11 @@ type jsoniterNumberCodec struct { } func (codec *jsoniterNumberCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { - *((*Number)(ptr)) = Number([]byte(iter.readNumberAsString())) + if iter.WhatIsNext() == StringValue { + *((*Number)(ptr)) = Number(iter.ReadString()) + } else { + *((*Number)(ptr)) = Number([]byte(iter.readNumberAsString())) + } } func (codec *jsoniterNumberCodec) Encode(ptr unsafe.Pointer, stream *Stream) { diff --git a/jsoniter_int_test.go b/jsoniter_int_test.go index 79670c7..7d7e0ad 100644 --- a/jsoniter_int_test.go +++ b/jsoniter_int_test.go @@ -506,6 +506,18 @@ func Test_jsoniter_number(t *testing.T) { should.Equal("1", str) } +func Test_non_numeric_as_number(t *testing.T) { + should := require.New(t) + var v1 json.Number + err := Unmarshal([]byte(`"500"`), &v1) + should.Nil(err) + should.Equal("500", string(v1)) + var v2 Number + err = Unmarshal([]byte(`"500"`), &v2) + should.Nil(err) + should.Equal("500", string(v2)) +} + func Benchmark_jsoniter_encode_int(b *testing.B) { stream := NewStream(ConfigDefault, ioutil.Discard, 64) for n := 0; n < b.N; n++ {