8 // ReadObject read one field from object.
9 // If object ended, returns empty string.
10 // Otherwise, returns the field name.
11 func (iter *Iterator) ReadObject() (ret string) {
15 iter.skipThreeBytes('u', 'l', 'l')
21 field := iter.ReadString()
24 iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c}))
29 return "" // end of object
31 iter.ReportError("ReadObject", `expect " after {, but found `+string([]byte{c}))
34 field := iter.ReadString()
37 iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c}))
41 return "" // end of object
43 iter.ReportError("ReadObject", fmt.Sprintf(`expect { or , or } or n, but found %s`, string([]byte{c})))
49 func (iter *Iterator) readFieldHash() int64 {
50 hash := int64(0x811c9dc5)
53 iter.ReportError("readFieldHash", `expect ", but found `+string([]byte{c}))
57 for i := iter.head; i < iter.tail; i++ {
58 // require ascii string and no escape
62 for _, b := range iter.readStringSlowPath() {
63 if 'A' <= b && b <= 'Z' && !iter.cfg.caseSensitive {
71 iter.ReportError("readFieldHash", `expect :, but found `+string([]byte{c}))
80 iter.ReportError("readFieldHash", `expect :, but found `+string([]byte{c}))
85 if 'A' <= b && b <= 'Z' && !iter.cfg.caseSensitive {
92 iter.ReportError("readFieldHash", `incomplete field name`)
98 func calcHash(str string, caseSensitive bool) int64 {
100 str = strings.ToLower(str)
102 hash := int64(0x811c9dc5)
103 for _, b := range []byte(str) {
110 // ReadObjectCB read object with callback, the key is ascii only and field name not copied
111 func (iter *Iterator) ReadObjectCB(callback func(*Iterator, string) bool) bool {
112 c := iter.nextToken()
118 field = iter.ReadString()
121 iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c}))
123 if !callback(iter, field) {
128 field = iter.ReadString()
131 iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c}))
133 if !callback(iter, field) {
139 iter.ReportError("ReadObjectCB", `object not ended with }`)
147 iter.ReportError("ReadObjectCB", `expect " after }, but found `+string([]byte{c}))
151 iter.skipThreeBytes('u', 'l', 'l')
154 iter.ReportError("ReadObjectCB", `expect { or n, but found `+string([]byte{c}))
158 // ReadMapCB read map with callback, the key can be any string
159 func (iter *Iterator) ReadMapCB(callback func(*Iterator, string) bool) bool {
160 c := iter.nextToken()
165 field := iter.ReadString()
166 if iter.nextToken() != ':' {
167 iter.ReportError("ReadMapCB", "expect : after object field, but found "+string([]byte{c}))
170 if !callback(iter, field) {
175 field = iter.ReadString()
176 if iter.nextToken() != ':' {
177 iter.ReportError("ReadMapCB", "expect : after object field, but found "+string([]byte{c}))
180 if !callback(iter, field) {
186 iter.ReportError("ReadMapCB", `object not ended with }`)
194 iter.ReportError("ReadMapCB", `expect " after }, but found `+string([]byte{c}))
198 iter.skipThreeBytes('u', 'l', 'l')
201 iter.ReportError("ReadMapCB", `expect { or n, but found `+string([]byte{c}))
205 func (iter *Iterator) readObjectStart() bool {
206 c := iter.nextToken()
215 iter.skipThreeBytes('u', 'l', 'l')
218 iter.ReportError("readObjectStart", "expect { or n, but found "+string([]byte{c}))
222 func (iter *Iterator) readObjectFieldAsBytes() (ret []byte) {
223 str := iter.ReadStringAsSlice()
224 if iter.skipWhitespacesWithoutLoadMore() {
226 ret = make([]byte, len(str))
229 if !iter.loadMore() {
233 if iter.buf[iter.head] != ':' {
234 iter.ReportError("readObjectFieldAsBytes", "expect : after object field, but found "+string([]byte{iter.buf[iter.head]}))
238 if iter.skipWhitespacesWithoutLoadMore() {
240 ret = make([]byte, len(str))
243 if !iter.loadMore() {