feature_iter_object.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. package jsoniter
  2. func (iter *Iterator) ReadObject() (ret string) {
  3. c := iter.nextToken()
  4. switch c {
  5. case 'n':
  6. iter.skipFixedBytes(3)
  7. return "" // null
  8. case '{':
  9. c = iter.nextToken()
  10. if c == '"' {
  11. iter.unreadByte()
  12. return string(iter.readObjectFieldAsBytes())
  13. }
  14. if c == '}' {
  15. return "" // end of object
  16. }
  17. iter.reportError("ReadObject", `expect " after {`)
  18. return
  19. case ',':
  20. return string(iter.readObjectFieldAsBytes())
  21. case '}':
  22. return "" // end of object
  23. default:
  24. iter.reportError("ReadObject", `expect { or , or } or n`)
  25. return
  26. }
  27. }
  28. func (iter *Iterator) readFieldHash() int32 {
  29. hash := 0x811c9dc5
  30. c := iter.nextToken()
  31. if c == '"' {
  32. for {
  33. for i := iter.head; i < iter.tail; i++ {
  34. // require ascii string and no escape
  35. b := iter.buf[i]
  36. if b == '"' {
  37. iter.head = i+1
  38. c = iter.nextToken()
  39. if c != ':' {
  40. iter.reportError("readFieldHash", `expect :, but found ` + string([]byte{c}))
  41. }
  42. return int32(hash)
  43. }
  44. hash ^= int(b)
  45. hash *= 0x1000193
  46. }
  47. if !iter.loadMore() {
  48. iter.reportError("readFieldHash", `incomplete field name`)
  49. return 0
  50. }
  51. }
  52. }
  53. iter.reportError("readFieldHash", `expect ", but found ` + string([]byte{c}))
  54. return 0
  55. }
  56. func calcHash(str string) int32 {
  57. hash := 0x811c9dc5
  58. for _, b := range str {
  59. hash ^= int(b)
  60. hash *= 0x1000193
  61. }
  62. return int32(hash)
  63. }
  64. func (iter *Iterator) ReadObjectCB(callback func(*Iterator, string) bool) bool {
  65. c := iter.nextToken()
  66. if c == '{' {
  67. c = iter.nextToken()
  68. if c == '"' {
  69. iter.unreadByte()
  70. field := string(iter.readObjectFieldAsBytes())
  71. if !callback(iter, field) {
  72. return false
  73. }
  74. for iter.nextToken() == ',' {
  75. field := string(iter.readObjectFieldAsBytes())
  76. if !callback(iter, field) {
  77. return false
  78. }
  79. }
  80. return true
  81. }
  82. if c == '}' {
  83. return true
  84. }
  85. iter.reportError("ReadObjectCB", `expect " after }`)
  86. return false
  87. }
  88. if c == 'n' {
  89. iter.skipFixedBytes(3)
  90. return true // null
  91. }
  92. iter.reportError("ReadObjectCB", `expect { or n`)
  93. return false
  94. }
  95. func (iter *Iterator) readObjectStart() bool {
  96. c := iter.nextToken()
  97. if c == '{' {
  98. c = iter.nextToken()
  99. if c == '}' {
  100. return false
  101. }
  102. iter.unreadByte()
  103. return true
  104. }
  105. iter.reportError("readObjectStart", "expect { ")
  106. return false
  107. }
  108. func (iter *Iterator) readObjectFieldAsBytes() (ret []byte) {
  109. str := iter.ReadStringAsSlice()
  110. if iter.skipWhitespacesWithoutLoadMore() {
  111. if ret == nil {
  112. ret = make([]byte, len(str))
  113. copy(ret, str)
  114. }
  115. if !iter.loadMore() {
  116. return
  117. }
  118. }
  119. if iter.buf[iter.head] != ':' {
  120. iter.reportError("readObjectFieldAsBytes", "expect : after object field")
  121. return
  122. }
  123. iter.head++
  124. if iter.skipWhitespacesWithoutLoadMore() {
  125. if ret == nil {
  126. ret = make([]byte, len(str))
  127. copy(ret, str)
  128. }
  129. if !iter.loadMore() {
  130. return
  131. }
  132. }
  133. if ret == nil {
  134. return str
  135. }
  136. return ret
  137. }