Skip to content

Commit 8f50a91

Browse files
committed
fix #181, support string as json.Number and jsoniter.Number
1 parent 73c7bc8 commit 8f50a91

File tree

2 files changed

+22
-2
lines changed

2 files changed

+22
-2
lines changed

feature_reflect_native.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -441,7 +441,11 @@ type jsonNumberCodec struct {
441441
}
442442

443443
func (codec *jsonNumberCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {
444-
*((*json.Number)(ptr)) = json.Number([]byte(iter.readNumberAsString()))
444+
if iter.WhatIsNext() == StringValue {
445+
*((*json.Number)(ptr)) = json.Number(iter.ReadString())
446+
} else {
447+
*((*json.Number)(ptr)) = json.Number([]byte(iter.readNumberAsString()))
448+
}
445449
}
446450

447451
func (codec *jsonNumberCodec) Encode(ptr unsafe.Pointer, stream *Stream) {
@@ -460,7 +464,11 @@ type jsoniterNumberCodec struct {
460464
}
461465

462466
func (codec *jsoniterNumberCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {
463-
*((*Number)(ptr)) = Number([]byte(iter.readNumberAsString()))
467+
if iter.WhatIsNext() == StringValue {
468+
*((*Number)(ptr)) = Number(iter.ReadString())
469+
} else {
470+
*((*Number)(ptr)) = Number([]byte(iter.readNumberAsString()))
471+
}
464472
}
465473

466474
func (codec *jsoniterNumberCodec) Encode(ptr unsafe.Pointer, stream *Stream) {

jsoniter_int_test.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -506,6 +506,18 @@ func Test_jsoniter_number(t *testing.T) {
506506
should.Equal("1", str)
507507
}
508508

509+
func Test_non_numeric_as_number(t *testing.T) {
510+
should := require.New(t)
511+
var v1 json.Number
512+
err := Unmarshal([]byte(`"500"`), &v1)
513+
should.Nil(err)
514+
should.Equal("500", string(v1))
515+
var v2 Number
516+
err = Unmarshal([]byte(`"500"`), &v2)
517+
should.Nil(err)
518+
should.Equal("500", string(v2))
519+
}
520+
509521
func Benchmark_jsoniter_encode_int(b *testing.B) {
510522
stream := NewStream(ConfigDefault, ioutil.Discard, 64)
511523
for n := 0; n < b.N; n++ {

0 commit comments

Comments
 (0)