From b91b7ac682a9a9e47a455f7d2ddd282f2ae329cb Mon Sep 17 00:00:00 2001 From: carlcarl Date: Tue, 11 Jul 2017 22:07:08 +0800 Subject: [PATCH 1/4] Fix #123, make iterator read int if using number --- feature_iter.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/feature_iter.go b/feature_iter.go index d314aad..601ee5f 100644 --- a/feature_iter.go +++ b/feature_iter.go @@ -273,6 +273,9 @@ func (iter *Iterator) Read() interface{} { case String: return iter.ReadString() case Number: + if iter.cfg.configBeforeFrozen.UseNumber { + return iter.ReadInt() + } return iter.ReadFloat64() case Nil: iter.skipFourBytes('n', 'u', 'l', 'l') From 7b1fd129cf3e6732549b50fee1be082bdab56206 Mon Sep 17 00:00:00 2001 From: carlcarl Date: Tue, 11 Jul 2017 23:39:09 +0800 Subject: [PATCH 2/4] Add test for iterator UseNumber --- jsoniter_iterator_test.go | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/jsoniter_iterator_test.go b/jsoniter_iterator_test.go index 7c356aa..8bae207 100644 --- a/jsoniter_iterator_test.go +++ b/jsoniter_iterator_test.go @@ -2,7 +2,11 @@ package jsoniter import ( "bytes" + "fmt" + "strconv" "testing" + + "github.com/stretchr/testify/require" ) func Test_bad_case(t *testing.T) { @@ -33,3 +37,30 @@ 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, err := strconv.ParseInt(input, 10, 32) + should.Nil(err) + should.Equal(int(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()) + }) + } +} From be9d4ded4f53914e1150fd40a6cb7d0e1f9ddcfe Mon Sep 17 00:00:00 2001 From: carlcarl Date: Wed, 12 Jul 2017 00:11:50 +0800 Subject: [PATCH 3/4] Use json.Number as the return --- feature_iter.go | 5 ++++- jsoniter_iterator_test.go | 6 +++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/feature_iter.go b/feature_iter.go index 601ee5f..b7d49c0 100644 --- a/feature_iter.go +++ b/feature_iter.go @@ -1,8 +1,10 @@ package jsoniter import ( + "encoding/json" "fmt" "io" + "strconv" ) // ValueType the type for JSON element @@ -274,7 +276,8 @@ func (iter *Iterator) Read() interface{} { return iter.ReadString() case Number: if iter.cfg.configBeforeFrozen.UseNumber { - return iter.ReadInt() + num := iter.ReadInt64() + return json.Number(strconv.FormatInt(num, 10)) } return iter.ReadFloat64() case Nil: diff --git a/jsoniter_iterator_test.go b/jsoniter_iterator_test.go index 8bae207..951574d 100644 --- a/jsoniter_iterator_test.go +++ b/jsoniter_iterator_test.go @@ -2,6 +2,7 @@ package jsoniter import ( "bytes" + "encoding/json" "fmt" "strconv" "testing" @@ -45,9 +46,8 @@ func Test_iterator_use_number(t *testing.T) { t.Run(fmt.Sprintf("%v", input), func(t *testing.T) { should := require.New(t) iter := ParseString(Config{UseNumber: true}.Froze(), input) - expected, err := strconv.ParseInt(input, 10, 32) - should.Nil(err) - should.Equal(int(expected), iter.Read()) + expected := json.Number(input) + should.Equal(expected, iter.Read()) }) } } From 90137b4a60d68b1f1d16ab5e4c5d037d9dda5976 Mon Sep 17 00:00:00 2001 From: carlcarl Date: Wed, 12 Jul 2017 00:23:49 +0800 Subject: [PATCH 4/4] Use readNumberAsString --- feature_iter.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/feature_iter.go b/feature_iter.go index b7d49c0..6e88914 100644 --- a/feature_iter.go +++ b/feature_iter.go @@ -4,7 +4,6 @@ import ( "encoding/json" "fmt" "io" - "strconv" ) // ValueType the type for JSON element @@ -276,8 +275,7 @@ func (iter *Iterator) Read() interface{} { return iter.ReadString() case Number: if iter.cfg.configBeforeFrozen.UseNumber { - num := iter.ReadInt64() - return json.Number(strconv.FormatInt(num, 10)) + return json.Number(iter.readNumberAsString()) } return iter.ReadFloat64() case Nil: