feature_any.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  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 WrapInt64(val int64) Any {
  51. return &intAny{baseAny{}, nil, val}
  52. }
  53. func (iter *Iterator) ReadAny() Any {
  54. return iter.readAny(nil)
  55. }
  56. func (iter *Iterator) readAny(reusableIter *Iterator) Any {
  57. c := iter.nextToken()
  58. switch c {
  59. case '"':
  60. return iter.readStringAny(reusableIter)
  61. case 'n':
  62. iter.skipFixedBytes(3) // null
  63. return &nilAny{}
  64. case 't':
  65. iter.skipFixedBytes(3) // true
  66. return &trueAny{}
  67. case 'f':
  68. iter.skipFixedBytes(4) // false
  69. return &falseAny{}
  70. case '{':
  71. return iter.readObjectAny(reusableIter)
  72. case '[':
  73. return iter.readArrayAny(reusableIter)
  74. default:
  75. iter.unreadByte()
  76. return iter.readNumberAny(reusableIter)
  77. }
  78. }
  79. func (iter *Iterator) readNumberAny(reusableIter *Iterator) Any {
  80. dotFound := false
  81. var lazyBuf []byte
  82. for {
  83. for i := iter.head; i < iter.tail; i++ {
  84. c := iter.buf[i]
  85. if c == '.' {
  86. dotFound = true
  87. continue
  88. }
  89. switch c {
  90. case ' ', '\n', '\r', '\t', ',', '}', ']':
  91. lazyBuf = append(lazyBuf, iter.buf[iter.head:i]...)
  92. iter.head = i
  93. if dotFound {
  94. return &floatLazyAny{baseAny{}, lazyBuf, reusableIter, nil, 0}
  95. } else {
  96. return &intLazyAny{baseAny{}, lazyBuf, reusableIter, nil, 0}
  97. }
  98. }
  99. }
  100. lazyBuf = append(lazyBuf, iter.buf[iter.head:iter.tail]...)
  101. if !iter.loadMore() {
  102. iter.head = iter.tail
  103. if dotFound {
  104. return &floatLazyAny{baseAny{}, lazyBuf, reusableIter, nil, 0}
  105. } else {
  106. return &intLazyAny{baseAny{}, lazyBuf, reusableIter, nil, 0}
  107. }
  108. }
  109. }
  110. }
  111. func (iter *Iterator) readStringAny(reusableIter *Iterator) Any {
  112. lazyBuf := make([]byte, 1, 8)
  113. lazyBuf[0] = '"'
  114. for {
  115. end, escaped := iter.findStringEnd()
  116. if end == -1 {
  117. lazyBuf = append(lazyBuf, iter.buf[iter.head:iter.tail]...)
  118. if !iter.loadMore() {
  119. iter.reportError("readStringAny", "incomplete string")
  120. return &invalidAny{}
  121. }
  122. if escaped {
  123. iter.head = 1 // skip the first char as last char read is \
  124. }
  125. } else {
  126. lazyBuf = append(lazyBuf, iter.buf[iter.head:end]...)
  127. iter.head = end
  128. return &stringLazyAny{baseAny{}, lazyBuf, reusableIter, nil, ""}
  129. }
  130. }
  131. }
  132. func (iter *Iterator) readObjectAny(reusableIter *Iterator) Any {
  133. level := 1
  134. lazyBuf := make([]byte, 1, 32)
  135. lazyBuf[0] = '{'
  136. for {
  137. start := iter.head
  138. for i := iter.head; i < iter.tail; i++ {
  139. switch iter.buf[i] {
  140. case '"': // If inside string, skip it
  141. iter.head = i + 1
  142. iter.skipString()
  143. i = iter.head - 1 // it will be i++ soon
  144. case '{': // If open symbol, increase level
  145. level++
  146. case '}': // If close symbol, increase level
  147. level--
  148. // If we have returned to the original level, we're done
  149. if level == 0 {
  150. iter.head = i + 1
  151. lazyBuf = append(lazyBuf, iter.buf[start:iter.head]...)
  152. return &objectLazyAny{baseAny{}, lazyBuf, reusableIter, nil, nil, lazyBuf}
  153. }
  154. }
  155. }
  156. lazyBuf = append(lazyBuf, iter.buf[iter.head:iter.tail]...)
  157. if !iter.loadMore() {
  158. iter.reportError("skipObject", "incomplete object")
  159. return &invalidAny{}
  160. }
  161. }
  162. }
  163. func (iter *Iterator) readArrayAny(reusableIter *Iterator) Any {
  164. level := 1
  165. lazyBuf := make([]byte, 1, 32)
  166. lazyBuf[0] = '['
  167. for {
  168. start := iter.head
  169. for i := iter.head; i < iter.tail; i++ {
  170. switch iter.buf[i] {
  171. case '"': // If inside string, skip it
  172. iter.head = i + 1
  173. iter.skipString()
  174. i = iter.head - 1 // it will be i++ soon
  175. case '[': // If open symbol, increase level
  176. level++
  177. case ']': // If close symbol, increase level
  178. level--
  179. // If we have returned to the original level, we're done
  180. if level == 0 {
  181. iter.head = i + 1
  182. lazyBuf = append(lazyBuf, iter.buf[start:iter.head]...)
  183. return &arrayLazyAny{baseAny{}, lazyBuf, reusableIter, nil, nil, lazyBuf}
  184. }
  185. }
  186. }
  187. lazyBuf = append(lazyBuf, iter.buf[iter.head:iter.tail]...)
  188. if !iter.loadMore() {
  189. iter.reportError("skipArray", "incomplete array")
  190. return &invalidAny{}
  191. }
  192. }
  193. }