feature_iter_object.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. package jsoniter
  2. import (
  3. "fmt"
  4. "unicode"
  5. "unsafe"
  6. )
  7. func (iter *Iterator) ReadObject() (ret string) {
  8. c := iter.nextToken()
  9. switch c {
  10. case 'n':
  11. iter.skipFixedBytes(3)
  12. return "" // null
  13. case '{':
  14. c = iter.nextToken()
  15. if c == '"' {
  16. iter.unreadByte()
  17. return string(iter.readObjectFieldAsBytes())
  18. }
  19. if c == '}' {
  20. return "" // end of object
  21. }
  22. iter.ReportError("ReadObject", `expect " after {`)
  23. return
  24. case ',':
  25. return string(iter.readObjectFieldAsBytes())
  26. case '}':
  27. return "" // end of object
  28. default:
  29. iter.ReportError("ReadObject", fmt.Sprintf(`expect { or , or } or n, but found %s`, string([]byte{c})))
  30. return
  31. }
  32. }
  33. func (iter *Iterator) readFieldHash() int32 {
  34. hash := int64(0x811c9dc5)
  35. c := iter.nextToken()
  36. if c == '"' {
  37. for {
  38. for i := iter.head; i < iter.tail; i++ {
  39. // require ascii string and no escape
  40. b := iter.buf[i]
  41. if 'A' <= b && b <= 'Z' {
  42. b += 'a' - 'A'
  43. }
  44. if b == '"' {
  45. iter.head = i + 1
  46. c = iter.nextToken()
  47. if c != ':' {
  48. iter.ReportError("readFieldHash", `expect :, but found `+string([]byte{c}))
  49. }
  50. return int32(hash)
  51. }
  52. hash ^= int64(b)
  53. hash *= 0x1000193
  54. }
  55. if !iter.loadMore() {
  56. iter.ReportError("readFieldHash", `incomplete field name`)
  57. return 0
  58. }
  59. }
  60. }
  61. iter.ReportError("readFieldHash", `expect ", but found `+string([]byte{c}))
  62. return 0
  63. }
  64. func calcHash(str string) int32 {
  65. hash := int64(0x811c9dc5)
  66. for _, b := range str {
  67. hash ^= int64(unicode.ToLower(b))
  68. hash *= 0x1000193
  69. }
  70. return int32(hash)
  71. }
  72. func (iter *Iterator) ReadObjectCB(callback func(*Iterator, string) bool) bool {
  73. c := iter.nextToken()
  74. if c == '{' {
  75. c = iter.nextToken()
  76. if c == '"' {
  77. iter.unreadByte()
  78. field := iter.readObjectFieldAsBytes()
  79. if !callback(iter, *(*string)(unsafe.Pointer(&field))) {
  80. return false
  81. }
  82. for iter.nextToken() == ',' {
  83. field = iter.readObjectFieldAsBytes()
  84. if !callback(iter, *(*string)(unsafe.Pointer(&field))) {
  85. return false
  86. }
  87. }
  88. return true
  89. }
  90. if c == '}' {
  91. return true
  92. }
  93. iter.ReportError("ReadObjectCB", `expect " after }`)
  94. return false
  95. }
  96. if c == 'n' {
  97. iter.skipFixedBytes(3)
  98. return true // null
  99. }
  100. iter.ReportError("ReadObjectCB", `expect { or n`)
  101. return false
  102. }
  103. func (iter *Iterator) ReadMapCB(callback func(*Iterator, string) bool) bool {
  104. c := iter.nextToken()
  105. if c == '{' {
  106. c = iter.nextToken()
  107. if c == '"' {
  108. iter.unreadByte()
  109. field := iter.ReadString()
  110. if iter.nextToken() != ':' {
  111. iter.ReportError("ReadMapCB", "expect : after object field")
  112. return false
  113. }
  114. if !callback(iter, field) {
  115. return false
  116. }
  117. for iter.nextToken() == ',' {
  118. field = iter.ReadString()
  119. if iter.nextToken() != ':' {
  120. iter.ReportError("ReadMapCB", "expect : after object field")
  121. return false
  122. }
  123. if !callback(iter, field) {
  124. return false
  125. }
  126. }
  127. return true
  128. }
  129. if c == '}' {
  130. return true
  131. }
  132. iter.ReportError("ReadMapCB", `expect " after }`)
  133. return false
  134. }
  135. if c == 'n' {
  136. iter.skipFixedBytes(3)
  137. return true // null
  138. }
  139. iter.ReportError("ReadMapCB", `expect { or n`)
  140. return false
  141. }
  142. func (iter *Iterator) readObjectStart() bool {
  143. c := iter.nextToken()
  144. if c == '{' {
  145. c = iter.nextToken()
  146. if c == '}' {
  147. return false
  148. }
  149. iter.unreadByte()
  150. return true
  151. } else if c == 'n' {
  152. iter.skipFixedBytes(3)
  153. return false
  154. }
  155. iter.ReportError("readObjectStart", "expect { or n")
  156. return false
  157. }
  158. func (iter *Iterator) readObjectFieldAsBytes() (ret []byte) {
  159. str := iter.ReadStringAsSlice()
  160. if iter.skipWhitespacesWithoutLoadMore() {
  161. if ret == nil {
  162. ret = make([]byte, len(str))
  163. copy(ret, str)
  164. }
  165. if !iter.loadMore() {
  166. return
  167. }
  168. }
  169. if iter.buf[iter.head] != ':' {
  170. iter.ReportError("readObjectFieldAsBytes", "expect : after object field")
  171. return
  172. }
  173. iter.head++
  174. if iter.skipWhitespacesWithoutLoadMore() {
  175. if ret == nil {
  176. ret = make([]byte, len(str))
  177. copy(ret, str)
  178. }
  179. if !iter.loadMore() {
  180. return
  181. }
  182. }
  183. if ret == nil {
  184. return str
  185. }
  186. return ret
  187. }