Ver código fonte

fix #227, fix empty json.Number

Tao Wen 7 anos atrás
pai
commit
c39a632e65
2 arquivos alterados com 30 adições e 4 exclusões
  1. 24 4
      feature_reflect_native.go
  2. 6 0
      jsoniter_int_test.go

+ 24 - 4
feature_reflect_native.go

@@ -458,11 +458,21 @@ func (codec *jsonNumberCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {
 }
 
 func (codec *jsonNumberCodec) Encode(ptr unsafe.Pointer, stream *Stream) {
-	stream.WriteRaw(string(*((*json.Number)(ptr))))
+	number := *((*json.Number)(ptr))
+	if len(number) == 0 {
+		stream.WriteRaw("0")
+	} else {
+		stream.WriteRaw(string(number))
+	}
 }
 
 func (codec *jsonNumberCodec) EncodeInterface(val interface{}, stream *Stream) {
-	stream.WriteRaw(string(val.(json.Number)))
+	number := val.(json.Number)
+	if len(number) == 0 {
+		stream.WriteRaw("0")
+	} else {
+		stream.WriteRaw(string(number))
+	}
 }
 
 func (codec *jsonNumberCodec) IsEmpty(ptr unsafe.Pointer) bool {
@@ -485,11 +495,21 @@ func (codec *jsoniterNumberCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {
 }
 
 func (codec *jsoniterNumberCodec) Encode(ptr unsafe.Pointer, stream *Stream) {
-	stream.WriteRaw(string(*((*Number)(ptr))))
+	number := *((*Number)(ptr))
+	if len(number) == 0 {
+		stream.WriteRaw("0")
+	} else {
+		stream.WriteRaw(string(number))
+	}
 }
 
 func (codec *jsoniterNumberCodec) EncodeInterface(val interface{}, stream *Stream) {
-	stream.WriteRaw(string(val.(Number)))
+	number := val.(Number)
+	if len(number) == 0 {
+		stream.WriteRaw("0")
+	} else {
+		stream.WriteRaw(string(number))
+	}
 }
 
 func (codec *jsoniterNumberCodec) IsEmpty(ptr unsafe.Pointer) bool {

+ 6 - 0
jsoniter_int_test.go

@@ -524,10 +524,16 @@ func Test_null_as_number(t *testing.T) {
 	err := json.Unmarshal([]byte(`null`), &v1)
 	should.Nil(err)
 	should.Equal("", string(v1))
+	output, err := json.Marshal(v1)
+	should.NoError(err)
+	should.Equal("0", string(output))
 	var v2 Number
 	err = Unmarshal([]byte(`null`), &v2)
 	should.Nil(err)
 	should.Equal("", string(v2))
+	output, err = Marshal(v2)
+	should.NoError(err)
+	should.Equal("0", string(output))
 }
 
 func Test_float_as_int(t *testing.T) {