Skip to content

Commit 16f7860

Browse files
committed
fix #184, support null as number
1 parent 8f50a91 commit 16f7860

File tree

2 files changed

+24
-4
lines changed

2 files changed

+24
-4
lines changed

feature_reflect_native.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -441,9 +441,13 @@ type jsonNumberCodec struct {
441441
}
442442

443443
func (codec *jsonNumberCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {
444-
if iter.WhatIsNext() == StringValue {
444+
switch iter.WhatIsNext() {
445+
case StringValue:
445446
*((*json.Number)(ptr)) = json.Number(iter.ReadString())
446-
} else {
447+
case NilValue:
448+
iter.skipFourBytes('n', 'u', 'l', 'l')
449+
*((*json.Number)(ptr)) = ""
450+
default:
447451
*((*json.Number)(ptr)) = json.Number([]byte(iter.readNumberAsString()))
448452
}
449453
}
@@ -464,9 +468,13 @@ type jsoniterNumberCodec struct {
464468
}
465469

466470
func (codec *jsoniterNumberCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {
467-
if iter.WhatIsNext() == StringValue {
471+
switch iter.WhatIsNext() {
472+
case StringValue:
468473
*((*Number)(ptr)) = Number(iter.ReadString())
469-
} else {
474+
case NilValue:
475+
iter.skipFourBytes('n', 'u', 'l', 'l')
476+
*((*Number)(ptr)) = ""
477+
default:
470478
*((*Number)(ptr)) = Number([]byte(iter.readNumberAsString()))
471479
}
472480
}

jsoniter_int_test.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -518,6 +518,18 @@ func Test_non_numeric_as_number(t *testing.T) {
518518
should.Equal("500", string(v2))
519519
}
520520

521+
func Test_null_as_number(t *testing.T) {
522+
should := require.New(t)
523+
var v1 json.Number
524+
err := json.Unmarshal([]byte(`null`), &v1)
525+
should.Nil(err)
526+
should.Equal("", string(v1))
527+
var v2 Number
528+
err = Unmarshal([]byte(`null`), &v2)
529+
should.Nil(err)
530+
should.Equal("", string(v2))
531+
}
532+
521533
func Benchmark_jsoniter_encode_int(b *testing.B) {
522534
stream := NewStream(ConfigDefault, ioutil.Discard, 64)
523535
for n := 0; n < b.N; n++ {

0 commit comments

Comments
 (0)