Tao Wen пре 9 година
родитељ
комит
928bc4ce72
4 измењених фајлова са 69 додато и 47 уклоњено
  1. 51 0
      feature_iter_array.go
  2. 1 2
      feature_iter_object.go
  3. 0 30
      iterator.go
  4. 17 15
      jsoniter_array_test.go

+ 51 - 0
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
+}

+ 1 - 2
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

+ 0 - 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

+ 17 - 15
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)