diff --git a/feature_iter.go b/feature_iter.go index d314aad..6e88914 100644 --- a/feature_iter.go +++ b/feature_iter.go @@ -1,6 +1,7 @@ package jsoniter import ( + "encoding/json" "fmt" "io" ) @@ -273,6 +274,9 @@ func (iter *Iterator) Read() interface{} { case String: return iter.ReadString() case Number: + if iter.cfg.configBeforeFrozen.UseNumber { + return json.Number(iter.readNumberAsString()) + } return iter.ReadFloat64() case Nil: iter.skipFourBytes('n', 'u', 'l', 'l') diff --git a/jsoniter_iterator_test.go b/jsoniter_iterator_test.go index 7c356aa..951574d 100644 --- a/jsoniter_iterator_test.go +++ b/jsoniter_iterator_test.go @@ -2,7 +2,12 @@ package jsoniter import ( "bytes" + "encoding/json" + "fmt" + "strconv" "testing" + + "github.com/stretchr/testify/require" ) func Test_bad_case(t *testing.T) { @@ -33,3 +38,29 @@ func Test_bad_case(t *testing.T) { t.Fatal(count) } } + +func Test_iterator_use_number(t *testing.T) { + // Test UseNumber with iterator Read() + inputs := []string{`2147483647`, `-2147483648`} + for _, input := range inputs { + t.Run(fmt.Sprintf("%v", input), func(t *testing.T) { + should := require.New(t) + iter := ParseString(Config{UseNumber: true}.Froze(), input) + expected := json.Number(input) + should.Equal(expected, iter.Read()) + }) + } +} + +func Test_iterator_without_number(t *testing.T) { + inputs := []string{`2147483647`, `-2147483648`} + for _, input := range inputs { + t.Run(fmt.Sprintf("%v", input), func(t *testing.T) { + should := require.New(t) + iter := ParseString(ConfigDefault, input) + expected, err := strconv.ParseInt(input, 10, 32) + should.Nil(err) + should.Equal(float64(expected), iter.Read()) + }) + } +}