mirror of
https://github.com/json-iterator/go.git
synced 2025-03-20 20:54:55 +02:00
ReadArrayCB
This commit is contained in:
parent
80c86e63b1
commit
928bc4ce72
51
feature_iter_array.go
Normal file
51
feature_iter_array.go
Normal file
@ -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
|
||||
}
|
@ -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
|
||||
|
30
iterator.go
30
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
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user