فهرست منبع

#40 support UseNumber

Tao Wen 8 سال پیش
والد
کامیت
962a8cd303
2فایلهای تغییر یافته به همراه27 افزوده شده و 1 حذف شده
  1. 13 1
      feature_adapter.go
  2. 14 0
      jsoniter_adapter_test.go

+ 13 - 1
feature_adapter.go

@@ -2,9 +2,11 @@ package jsoniter
 
 import (
 	"bytes"
-	"errors"
 	"io"
 	"reflect"
+	"errors"
+	"unsafe"
+	"encoding/json"
 )
 
 // Unmarshal adapts to json/encoding Unmarshal API
@@ -147,6 +149,16 @@ func (adapter *AdaptedDecoder) Buffered() io.Reader {
 	return bytes.NewReader(remaining)
 }
 
+func (decoder *AdaptedDecoder) UseNumber() {
+	RegisterTypeDecoder("interface {}", func(ptr unsafe.Pointer, iter *Iterator) {
+		if iter.WhatIsNext() == Number {
+			*((*interface{})(ptr)) = json.Number(iter.readNumberAsString())
+		} else {
+			*((*interface{})(ptr)) = iter.Read()
+		}
+	})
+}
+
 func NewEncoder(writer io.Writer) *AdaptedEncoder {
 	stream := NewStream(writer, 512)
 	return &AdaptedEncoder{stream}

+ 14 - 0
jsoniter_adapter_test.go

@@ -43,4 +43,18 @@ func Test_new_encoder(t *testing.T) {
 	encoder2 := NewEncoder(buf2)
 	encoder2.Encode([]int{1})
 	should.Equal("[1]", buf2.String())
+}
+
+func Test_use_number(t *testing.T) {
+	should := require.New(t)
+	decoder1 := json.NewDecoder(bytes.NewBufferString(`123`))
+	decoder1.UseNumber()
+	decoder2 := NewDecoder(bytes.NewBufferString(`123`))
+	decoder2.UseNumber()
+	var obj1 interface{}
+	should.Nil(decoder1.Decode(&obj1))
+	should.Equal(json.Number("123"), obj1)
+	var obj2 interface{}
+	should.Nil(decoder2.Decode(&obj2))
+	should.Equal(json.Number("123"), obj2)
 }