1
0
mirror of https://github.com/json-iterator/go.git synced 2025-04-20 11:28:49 +02:00

remove special handling for field

This commit is contained in:
Tao Wen 2018-02-14 10:31:55 +08:00
parent 477be43d00
commit 64cc784089
3 changed files with 24 additions and 50 deletions

View File

@ -3,7 +3,6 @@ package jsoniter
import ( import (
"fmt" "fmt"
"unicode" "unicode"
"unsafe"
) )
// ReadObject read one field from object. // ReadObject read one field from object.
@ -19,26 +18,6 @@ func (iter *Iterator) ReadObject() (ret string) {
c = iter.nextToken() c = iter.nextToken()
if c == '"' { if c == '"' {
iter.unreadByte() iter.unreadByte()
if iter.cfg.objectFieldMustBeSimpleString {
return string(iter.readObjectFieldAsBytes())
} else {
field := iter.ReadString()
c = iter.nextToken()
if c != ':' {
iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c}))
}
return field
}
}
if c == '}' {
return "" // end of object
}
iter.ReportError("ReadObject", `expect " after {, but found `+string([]byte{c}))
return
case ',':
if iter.cfg.objectFieldMustBeSimpleString {
return string(iter.readObjectFieldAsBytes())
} else {
field := iter.ReadString() field := iter.ReadString()
c = iter.nextToken() c = iter.nextToken()
if c != ':' { if c != ':' {
@ -46,6 +25,18 @@ func (iter *Iterator) ReadObject() (ret string) {
} }
return field return field
} }
if c == '}' {
return "" // end of object
}
iter.ReportError("ReadObject", `expect " after {, but found `+string([]byte{c}))
return
case ',':
field := iter.ReadString()
c = iter.nextToken()
if c != ':' {
iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c}))
}
return field
case '}': case '}':
return "" // end of object return "" // end of object
default: default:
@ -115,36 +106,25 @@ func calcHash(str string) int32 {
// ReadObjectCB read object with callback, the key is ascii only and field name not copied // ReadObjectCB read object with callback, the key is ascii only and field name not copied
func (iter *Iterator) ReadObjectCB(callback func(*Iterator, string) bool) bool { func (iter *Iterator) ReadObjectCB(callback func(*Iterator, string) bool) bool {
c := iter.nextToken() c := iter.nextToken()
var fieldBytes []byte
var field string var field string
if c == '{' { if c == '{' {
c = iter.nextToken() c = iter.nextToken()
if c == '"' { if c == '"' {
iter.unreadByte() iter.unreadByte()
if iter.cfg.objectFieldMustBeSimpleString { field = iter.ReadString()
fieldBytes = iter.readObjectFieldAsBytes() c = iter.nextToken()
field = *(*string)(unsafe.Pointer(&fieldBytes)) if c != ':' {
} else { iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c}))
field = iter.ReadString()
c = iter.nextToken()
if c != ':' {
iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c}))
}
} }
if !callback(iter, field) { if !callback(iter, field) {
return false return false
} }
c = iter.nextToken() c = iter.nextToken()
for c == ',' { for c == ',' {
if iter.cfg.objectFieldMustBeSimpleString { field = iter.ReadString()
fieldBytes = iter.readObjectFieldAsBytes() c = iter.nextToken()
field = *(*string)(unsafe.Pointer(&fieldBytes)) if c != ':' {
} else { iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c}))
field = iter.ReadString()
c = iter.nextToken()
if c != ':' {
iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c}))
}
} }
if !callback(iter, field) { if !callback(iter, field) {
return false return false

View File

@ -487,15 +487,10 @@ func (decoder *generalStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator)
fieldDecoder.Decode(ptr, iter) fieldDecoder.Decode(ptr, iter)
} }
for iter.nextToken() == ',' { for iter.nextToken() == ',' {
if iter.cfg.objectFieldMustBeSimpleString { field = iter.ReadString()
fieldBytes := iter.readObjectFieldAsBytes() c := iter.nextToken()
field = *(*string)(unsafe.Pointer(&fieldBytes)) if c != ':' {
} else { iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c}))
field = iter.ReadString()
c := iter.nextToken()
if c != ':' {
iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c}))
}
} }
fieldDecoder = decoder.fields[strings.ToLower(field)] fieldDecoder = decoder.fields[strings.ToLower(field)]
if fieldDecoder == nil { if fieldDecoder == nil {

View File

@ -1,7 +1,6 @@
package test package test
func init() { func init() {
// TODO: fix this
//testCases = append(testCases, //testCases = append(testCases,
// (*struct { // (*struct {
// Upper bool `json:"M"` // Upper bool `json:"M"`