feature_any.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. package jsoniter
  2. type Any interface {
  3. LastError() error
  4. ToBool() bool
  5. ToInt() int
  6. ToInt32() int32
  7. ToInt64() int64
  8. ToFloat32() float32
  9. ToFloat64() float64
  10. ToString() string
  11. Get(path ...interface{}) Any
  12. Size() int
  13. Keys() []string
  14. IterateObject() (func() (string, Any, bool), bool)
  15. IterateArray() (func() (Any, bool), bool)
  16. GetArray() []Any
  17. SetArray(newList []Any) bool
  18. GetObject() map[string]Any
  19. SetObject(map[string]Any) bool
  20. WriteTo(stream *Stream)
  21. }
  22. type baseAny struct{}
  23. func (any *baseAny) Get(path ...interface{}) Any {
  24. return &invalidAny{}
  25. }
  26. func (any *baseAny) Size() int {
  27. return 0
  28. }
  29. func (any *baseAny) Keys() []string {
  30. return []string{}
  31. }
  32. func (any *baseAny) IterateObject() (func() (string, Any, bool), bool) {
  33. return nil, false
  34. }
  35. func (any *baseAny) IterateArray() (func() (Any, bool), bool) {
  36. return nil, false
  37. }
  38. func (any *baseAny) GetArray() []Any {
  39. return []Any{}
  40. }
  41. func (any *baseAny) SetArray(newList []Any) bool {
  42. return false
  43. }
  44. func (any *baseAny) GetObject() map[string]Any {
  45. return map[string]Any{}
  46. }
  47. func (any *baseAny) SetObject(map[string]Any) bool {
  48. return false
  49. }
  50. func (any *baseAny) WriteTo(stream *Stream) {
  51. }
  52. func WrapInt64(val int64) Any {
  53. return &intAny{baseAny{}, nil, val}
  54. }
  55. func (iter *Iterator) ReadAny() Any {
  56. return iter.readAny(nil)
  57. }
  58. func (iter *Iterator) readAny(reusableIter *Iterator) Any {
  59. c := iter.nextToken()
  60. switch c {
  61. case '"':
  62. return iter.readStringAny(reusableIter)
  63. case 'n':
  64. iter.skipFixedBytes(3) // null
  65. return &nilAny{}
  66. case 't':
  67. iter.skipFixedBytes(3) // true
  68. return &trueAny{}
  69. case 'f':
  70. iter.skipFixedBytes(4) // false
  71. return &falseAny{}
  72. case '{':
  73. return iter.readObjectAny(reusableIter)
  74. case '[':
  75. return iter.readArrayAny(reusableIter)
  76. default:
  77. iter.unreadByte()
  78. return iter.readNumberAny(reusableIter)
  79. }
  80. }
  81. func (iter *Iterator) readNumberAny(reusableIter *Iterator) Any {
  82. dotFound := false
  83. var lazyBuf []byte
  84. for {
  85. for i := iter.head; i < iter.tail; i++ {
  86. c := iter.buf[i]
  87. if c == '.' {
  88. dotFound = true
  89. continue
  90. }
  91. switch c {
  92. case ' ', '\n', '\r', '\t', ',', '}', ']':
  93. lazyBuf = append(lazyBuf, iter.buf[iter.head:i]...)
  94. iter.head = i
  95. if dotFound {
  96. return &floatLazyAny{baseAny{}, lazyBuf, reusableIter, nil, 0}
  97. } else {
  98. return &intLazyAny{baseAny{}, lazyBuf, reusableIter, nil, 0}
  99. }
  100. }
  101. }
  102. lazyBuf = append(lazyBuf, iter.buf[iter.head:iter.tail]...)
  103. if !iter.loadMore() {
  104. iter.head = iter.tail
  105. if dotFound {
  106. return &floatLazyAny{baseAny{}, lazyBuf, reusableIter, nil, 0}
  107. } else {
  108. return &intLazyAny{baseAny{}, lazyBuf, reusableIter, nil, 0}
  109. }
  110. }
  111. }
  112. }
  113. func (iter *Iterator) readStringAny(reusableIter *Iterator) Any {
  114. lazyBuf := make([]byte, 1, 8)
  115. lazyBuf[0] = '"'
  116. for {
  117. end, escaped := iter.findStringEnd()
  118. if end == -1 {
  119. lazyBuf = append(lazyBuf, iter.buf[iter.head:iter.tail]...)
  120. if !iter.loadMore() {
  121. iter.reportError("readStringAny", "incomplete string")
  122. return &invalidAny{}
  123. }
  124. if escaped {
  125. iter.head = 1 // skip the first char as last char read is \
  126. }
  127. } else {
  128. lazyBuf = append(lazyBuf, iter.buf[iter.head:end]...)
  129. iter.head = end
  130. return &stringLazyAny{baseAny{}, lazyBuf, reusableIter, nil, ""}
  131. }
  132. }
  133. }
  134. func (iter *Iterator) readObjectAny(reusableIter *Iterator) Any {
  135. level := 1
  136. lazyBuf := make([]byte, 1, 32)
  137. lazyBuf[0] = '{'
  138. for {
  139. start := iter.head
  140. for i := iter.head; i < iter.tail; i++ {
  141. switch iter.buf[i] {
  142. case '"': // If inside string, skip it
  143. iter.head = i + 1
  144. iter.skipString()
  145. i = iter.head - 1 // it will be i++ soon
  146. case '{': // If open symbol, increase level
  147. level++
  148. case '}': // If close symbol, increase level
  149. level--
  150. // If we have returned to the original level, we're done
  151. if level == 0 {
  152. iter.head = i + 1
  153. lazyBuf = append(lazyBuf, iter.buf[start:iter.head]...)
  154. return &objectLazyAny{baseAny{}, lazyBuf, reusableIter, nil, nil, lazyBuf}
  155. }
  156. }
  157. }
  158. lazyBuf = append(lazyBuf, iter.buf[iter.head:iter.tail]...)
  159. if !iter.loadMore() {
  160. iter.reportError("skipObject", "incomplete object")
  161. return &invalidAny{}
  162. }
  163. }
  164. }
  165. func (iter *Iterator) readArrayAny(reusableIter *Iterator) Any {
  166. level := 1
  167. lazyBuf := make([]byte, 1, 32)
  168. lazyBuf[0] = '{'
  169. for {
  170. start := iter.head
  171. for i := iter.head; i < iter.tail; i++ {
  172. switch iter.buf[i] {
  173. case '"': // If inside string, skip it
  174. iter.head = i + 1
  175. iter.skipString()
  176. i = iter.head - 1 // it will be i++ soon
  177. case '[': // If open symbol, increase level
  178. level++
  179. case ']': // If close symbol, increase level
  180. level--
  181. // If we have returned to the original level, we're done
  182. if level == 0 {
  183. iter.head = i + 1
  184. lazyBuf = append(lazyBuf, iter.buf[start:iter.head]...)
  185. return &arrayLazyAny{baseAny{}, lazyBuf, reusableIter, nil, nil, lazyBuf}
  186. }
  187. }
  188. }
  189. lazyBuf = append(lazyBuf, iter.buf[iter.head:iter.tail]...)
  190. if !iter.loadMore() {
  191. iter.reportError("skipArray", "incomplete array")
  192. return &invalidAny{}
  193. }
  194. }
  195. }