diff --git a/feature_iter_array.go b/feature_iter_array.go new file mode 100644 index 0000000..bfdef8b --- /dev/null +++ b/feature_iter_array.go @@ -0,0 +1,51 @@ +package jsoniter + +func (iter *Iterator) ReadArray() (ret bool) { + c := iter.nextToken() + switch c { + case 'n': + iter.skipFixedBytes(3) + return false // null + case '[': + c = iter.nextToken() + if c != ']' { + iter.unreadByte() + return true + } + return false + case ']': + return false + case ',': + return true + default: + iter.reportError("ReadArray", "expect [ or , or ] or n, but found: " + string([]byte{c})) + return + } +} + + +func (iter *Iterator) ReadArrayCB(callback func(*Iterator) bool) (ret bool) { + c := iter.nextToken() + if c == '[' { + c = iter.nextToken() + if c != ']' { + iter.unreadByte() + if !callback(iter) { + return false + } + for iter.nextToken() == ',' { + if !callback(iter) { + return false + } + } + return true + } + return true + } + if c == 'n' { + iter.skipFixedBytes(3) + return true // null + } + iter.reportError("ReadArrayCB", "expect [ or n, but found: " + string([]byte{c})) + return false +} \ No newline at end of file diff --git a/feature_iter_object.go b/feature_iter_object.go index a741a9c..18a0635 100644 --- a/feature_iter_object.go +++ b/feature_iter_object.go @@ -37,8 +37,7 @@ func (iter *Iterator) ReadObjectCB(callback func(*Iterator, string) bool) bool { if !callback(iter, field) { return false } - c = iter.nextToken() - for c == ',' { + for iter.nextToken() == ',' { field := string(iter.readObjectFieldAsBytes()) if !callback(iter, field) { return false diff --git a/iterator.go b/iterator.go index 9d12641..a84e5ad 100644 --- a/iterator.go +++ b/iterator.go @@ -223,36 +223,6 @@ func (iter *Iterator) unreadByte() { return } -// ReadArray reads a json object as Array -func (iter *Iterator) ReadArray() (ret bool) { - c := iter.nextToken() - if iter.Error != nil { - return - } - switch c { - case 'n': - iter.skipFixedBytes(3) - return false // null - case '[': - c = iter.nextToken() - if iter.Error != nil { - return - } - if c == ']' { - return false - } - iter.unreadByte() - return true - case ']': - return false - case ',': - return true - default: - iter.reportError("ReadArray", "expect [ or , or ] or n, but found: " + string([]byte{c})) - return - } -} - // ReadBase64 reads a json object as Base64 in byte slice diff --git a/jsoniter_array_test.go b/jsoniter_array_test.go index 11b4078..27ec914 100644 --- a/jsoniter_array_test.go +++ b/jsoniter_array_test.go @@ -8,26 +8,28 @@ import ( ) func Test_empty_array(t *testing.T) { + should := require.New(t) iter := ParseString(`[]`) cont := iter.ReadArray() - if cont != false { - t.FailNow() - } + should.False(cont) + iter = ParseString(`[]`) + iter.ReadArrayCB(func(iter *Iterator) bool { + should.FailNow("should not call") + return true + }) } func Test_one_element(t *testing.T) { + should := require.New(t) iter := ParseString(`[1]`) - cont := iter.ReadArray() - if cont != true { - t.FailNow() - } - if iter.ReadInt64() != 1 { - t.FailNow() - } - cont = iter.ReadArray() - if cont != false { - t.FailNow() - } + should.True(iter.ReadArray()) + should.Equal(1, iter.ReadInt()) + should.False(iter.ReadArray()) + iter = ParseString(`[1]`) + iter.ReadArrayCB(func(iter *Iterator) bool { + should.Equal(1, iter.ReadInt()) + return true + }) } func Test_two_elements(t *testing.T) { @@ -136,7 +138,7 @@ func Test_write_array(t *testing.T) { func Test_write_val_array(t *testing.T) { should := require.New(t) - val := []int{1,2,3} + val := []int{1, 2, 3} str, err := MarshalToString(val) should.Nil(err) should.Equal("[1,2,3]", str)