1
0
mirror of https://github.com/json-iterator/go.git synced 2025-04-17 11:26:35 +02:00

next token

This commit is contained in:
Tao Wen 2016-12-06 20:09:19 +08:00
parent e5f5c5716b
commit c5576a8a31

@ -88,6 +88,23 @@ func (iter *Iterator) skipWhitespaces() {
} }
} }
func (iter *Iterator) nextToken() byte {
for {
for i := iter.head; i < iter.tail; i++ {
c := iter.buf[i]
switch c {
case ' ', '\n', '\t', 'r':
continue
}
iter.head = i+1
return c
}
if !iter.loadMore() {
return 0
}
}
}
func (iter *Iterator) ReportError(operation string, msg string) { func (iter *Iterator) ReportError(operation string, msg string) {
if iter.Error != nil { if iter.Error != nil {
return return
@ -483,8 +500,7 @@ func appendRune(p []byte, r rune) []byte {
} }
func (iter *Iterator) ReadArray() (ret bool) { func (iter *Iterator) ReadArray() (ret bool) {
iter.skipWhitespaces() c := iter.nextToken()
c := iter.readByte()
if iter.Error != nil { if iter.Error != nil {
return return
} }
@ -494,8 +510,7 @@ func (iter *Iterator) ReadArray() (ret bool) {
return false // null return false // null
} }
case '[': { case '[': {
iter.skipWhitespaces() c = iter.nextToken()
c = iter.readByte()
if iter.Error != nil { if iter.Error != nil {
return return
} }
@ -517,8 +532,7 @@ func (iter *Iterator) ReadArray() (ret bool) {
} }
func (iter *Iterator) ReadArrayCB(cb func()) { func (iter *Iterator) ReadArrayCB(cb func()) {
iter.skipWhitespaces() c := iter.nextToken()
c := iter.readByte()
if c == 'n' { if c == 'n' {
iter.skipNull() iter.skipNull()
return // null return // null
@ -527,8 +541,7 @@ func (iter *Iterator) ReadArrayCB(cb func()) {
iter.ReportError("ReadArray", "expect [ or n") iter.ReportError("ReadArray", "expect [ or n")
return return
} }
iter.skipWhitespaces() c = iter.nextToken()
c = iter.readByte()
if c == ']' { if c == ']' {
return // [] return // []
} else { } else {
@ -539,8 +552,7 @@ func (iter *Iterator) ReadArrayCB(cb func()) {
return return
} }
cb() cb()
iter.skipWhitespaces() c = iter.nextToken()
c = iter.readByte()
if c == ']' { if c == ']' {
return return
} }
@ -553,8 +565,7 @@ func (iter *Iterator) ReadArrayCB(cb func()) {
} }
func (iter *Iterator) ReadObject() (ret string) { func (iter *Iterator) ReadObject() (ret string) {
iter.skipWhitespaces() c := iter.nextToken()
c := iter.readByte()
if iter.Error != nil { if iter.Error != nil {
return return
} }
@ -567,8 +578,7 @@ func (iter *Iterator) ReadObject() (ret string) {
return "" // null return "" // null
} }
case '{': { case '{': {
iter.skipWhitespaces() c = iter.nextToken()
c = iter.readByte()
if iter.Error != nil { if iter.Error != nil {
return return
} }
@ -600,8 +610,7 @@ func (iter *Iterator) readObjectField() (ret string) {
if iter.Error != nil { if iter.Error != nil {
return return
} }
iter.skipWhitespaces() c := iter.nextToken()
c := iter.readByte()
if iter.Error != nil { if iter.Error != nil {
return return
} }
@ -803,8 +812,7 @@ func (iter *Iterator) skipNumber() {
func (iter *Iterator) skipArray() { func (iter *Iterator) skipArray() {
for { for {
iter.skipWhitespaces() c := iter.nextToken()
c := iter.readByte()
if iter.Error != nil { if iter.Error != nil {
return return
} }
@ -813,8 +821,7 @@ func (iter *Iterator) skipArray() {
} }
iter.unreadByte() iter.unreadByte()
iter.Skip() iter.Skip()
iter.skipWhitespaces() c = iter.nextToken()
c = iter.readByte()
switch c { switch c {
case ',': case ',':
iter.skipWhitespaces() iter.skipWhitespaces()
@ -829,8 +836,7 @@ func (iter *Iterator) skipArray() {
} }
func (iter *Iterator) skipObject() { func (iter *Iterator) skipObject() {
iter.skipWhitespaces() c := iter.nextToken()
c := iter.readByte()
if iter.Error != nil { if iter.Error != nil {
return return
} }
@ -840,23 +846,20 @@ func (iter *Iterator) skipObject() {
iter.unreadByte() iter.unreadByte()
} }
for { for {
iter.skipWhitespaces() c = iter.nextToken()
c := iter.readByte()
if c != '"' { if c != '"' {
iter.ReportError("skipObject", `expects "`) iter.ReportError("skipObject", `expects "`)
return return
} }
iter.skipString() iter.skipString()
iter.skipWhitespaces() c = iter.nextToken()
c = iter.readByte()
if c != ':' { if c != ':' {
iter.ReportError("skipObject", `expects :`) iter.ReportError("skipObject", `expects :`)
return return
} }
iter.skipWhitespaces() iter.skipWhitespaces()
iter.Skip() iter.Skip()
iter.skipWhitespaces() c = iter.nextToken()
c = iter.readByte()
switch c { switch c {
case ',': case ',':
iter.skipWhitespaces() iter.skipWhitespaces()