feature_any.go 4.9 KB

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