diff --git a/feature_adapter.go b/feature_adapter.go index 4e9679b..91b9b3d 100644 --- a/feature_adapter.go +++ b/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} diff --git a/jsoniter_adapter_test.go b/jsoniter_adapter_test.go index ae33fd8..6753bb6 100644 --- a/jsoniter_adapter_test.go +++ b/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) } \ No newline at end of file