Quellcode durchsuchen

fix #181, support string as json.Number and jsoniter.Number

Tao Wen vor 8 Jahren
Ursprung
Commit
8f50a91be2
2 geänderte Dateien mit 22 neuen und 2 gelöschten Zeilen
  1. 10 2
      feature_reflect_native.go
  2. 12 0
      jsoniter_int_test.go

+ 10 - 2
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) {

+ 12 - 0
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++ {