feature_any.go 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. package jsoniter
  2. import (
  3. "fmt"
  4. "reflect"
  5. )
  6. type Any interface {
  7. LastError() error
  8. ValueType() ValueType
  9. ToBool() bool
  10. ToInt() int
  11. ToInt32() int32
  12. ToInt64() int64
  13. ToFloat32() float32
  14. ToFloat64() float64
  15. ToString() string
  16. Get(path ...interface{}) Any
  17. Size() int
  18. Keys() []string
  19. IterateObject() (func() (string, Any, bool), bool)
  20. IterateArray() (func() (Any, bool), bool)
  21. GetArray() []Any
  22. SetArray(newList []Any) bool
  23. GetObject() map[string]Any
  24. SetObject(map[string]Any) bool
  25. GetInterface() interface{}
  26. WriteTo(stream *Stream)
  27. Parse() *Iterator
  28. }
  29. type baseAny struct{}
  30. func (any *baseAny) Get(path ...interface{}) Any {
  31. return &invalidAny{baseAny{}, fmt.Errorf("Get %v from simple value", path)}
  32. }
  33. func (any *baseAny) Size() int {
  34. return 0
  35. }
  36. func (any *baseAny) Keys() []string {
  37. return []string{}
  38. }
  39. func (any *baseAny) IterateObject() (func() (string, Any, bool), bool) {
  40. return nil, false
  41. }
  42. func (any *baseAny) IterateArray() (func() (Any, bool), bool) {
  43. return nil, false
  44. }
  45. func (any *baseAny) GetArray() []Any {
  46. return []Any{}
  47. }
  48. func (any *baseAny) SetArray(newList []Any) bool {
  49. return false
  50. }
  51. func (any *baseAny) GetObject() map[string]Any {
  52. return map[string]Any{}
  53. }
  54. func (any *baseAny) SetObject(map[string]Any) bool {
  55. return false
  56. }
  57. func WrapInt64(val int64) Any {
  58. return &intAny{baseAny{}, val}
  59. }
  60. func WrapFloat64(val float64) Any {
  61. return &floatAny{baseAny{}, val}
  62. }
  63. func WrapString(val string) Any {
  64. return &stringAny{baseAny{}, nil, val}
  65. }
  66. func Wrap(val interface{}) Any {
  67. if val == nil {
  68. return &nilAny{}
  69. }
  70. type_ := reflect.TypeOf(val)
  71. switch type_.Kind() {
  72. case reflect.Slice:
  73. return wrapArray(val)
  74. case reflect.Struct:
  75. return wrapStruct(val)
  76. case reflect.Map:
  77. return wrapMap(val)
  78. case reflect.String:
  79. return WrapString(val.(string))
  80. case reflect.Int:
  81. return WrapInt64(int64(val.(int)))
  82. case reflect.Int8:
  83. return WrapInt64(int64(val.(int8)))
  84. case reflect.Int16:
  85. return WrapInt64(int64(val.(int16)))
  86. case reflect.Int32:
  87. return WrapInt64(int64(val.(int32)))
  88. case reflect.Int64:
  89. return WrapInt64(val.(int64))
  90. case reflect.Uint:
  91. return WrapInt64(int64(val.(uint)))
  92. case reflect.Uint8:
  93. return WrapInt64(int64(val.(uint8)))
  94. case reflect.Uint16:
  95. return WrapInt64(int64(val.(uint16)))
  96. case reflect.Uint32:
  97. return WrapInt64(int64(val.(uint32)))
  98. case reflect.Uint64:
  99. return WrapInt64(int64(val.(uint64)))
  100. case reflect.Float32:
  101. return WrapFloat64(float64(val.(float32)))
  102. case reflect.Float64:
  103. return WrapFloat64(val.(float64))
  104. case reflect.Bool:
  105. if val.(bool) == true {
  106. return &trueAny{}
  107. } else {
  108. return &falseAny{}
  109. }
  110. }
  111. return &invalidAny{baseAny{}, fmt.Errorf("unsupported type: %v", type_)}
  112. }
  113. func (iter *Iterator) ReadAny() Any {
  114. return iter.readAny(nil)
  115. }
  116. func (iter *Iterator) readAny(reusableIter *Iterator) Any {
  117. c := iter.nextToken()
  118. switch c {
  119. case '"':
  120. return iter.readStringAny(reusableIter)
  121. case 'n':
  122. iter.skipFixedBytes(3) // null
  123. return &nilAny{}
  124. case 't':
  125. iter.skipFixedBytes(3) // true
  126. return &trueAny{}
  127. case 'f':
  128. iter.skipFixedBytes(4) // false
  129. return &falseAny{}
  130. case '{':
  131. return iter.readObjectAny(reusableIter)
  132. case '[':
  133. return iter.readArrayAny(reusableIter)
  134. default:
  135. iter.unreadByte()
  136. return iter.readNumberAny(reusableIter)
  137. }
  138. }
  139. func (iter *Iterator) readNumberAny(reusableIter *Iterator) Any {
  140. dotFound := false
  141. var lazyBuf []byte
  142. for {
  143. for i := iter.head; i < iter.tail; i++ {
  144. c := iter.buf[i]
  145. if c == '.' {
  146. dotFound = true
  147. continue
  148. }
  149. switch c {
  150. case ' ', '\n', '\r', '\t', ',', '}', ']':
  151. lazyBuf = append(lazyBuf, iter.buf[iter.head:i]...)
  152. iter.head = i
  153. if dotFound {
  154. return &floatLazyAny{baseAny{}, lazyBuf, reusableIter, nil, 0}
  155. } else {
  156. return &intLazyAny{baseAny{}, lazyBuf, reusableIter, nil, 0}
  157. }
  158. }
  159. }
  160. lazyBuf = append(lazyBuf, iter.buf[iter.head:iter.tail]...)
  161. if !iter.loadMore() {
  162. iter.head = iter.tail
  163. if dotFound {
  164. return &floatLazyAny{baseAny{}, lazyBuf, reusableIter, nil, 0}
  165. } else {
  166. return &intLazyAny{baseAny{}, lazyBuf, reusableIter, nil, 0}
  167. }
  168. }
  169. }
  170. }
  171. func (iter *Iterator) readStringAny(reusableIter *Iterator) Any {
  172. lazyBuf := make([]byte, 1, 8)
  173. lazyBuf[0] = '"'
  174. for {
  175. end, escaped := iter.findStringEnd()
  176. if end == -1 {
  177. lazyBuf = append(lazyBuf, iter.buf[iter.head:iter.tail]...)
  178. if !iter.loadMore() {
  179. iter.reportError("readStringAny", "incomplete string")
  180. return &invalidAny{}
  181. }
  182. if escaped {
  183. iter.head = 1 // skip the first char as last char read is \
  184. }
  185. } else {
  186. lazyBuf = append(lazyBuf, iter.buf[iter.head:end]...)
  187. iter.head = end
  188. return &stringLazyAny{baseAny{}, lazyBuf, reusableIter, nil, ""}
  189. }
  190. }
  191. }
  192. func (iter *Iterator) readObjectAny(reusableIter *Iterator) Any {
  193. level := 1
  194. lazyBuf := make([]byte, 1, 32)
  195. lazyBuf[0] = '{'
  196. for {
  197. start := iter.head
  198. for i := iter.head; i < iter.tail; i++ {
  199. switch iter.buf[i] {
  200. case '"': // If inside string, skip it
  201. iter.head = i + 1
  202. iter.skipString()
  203. i = iter.head - 1 // it will be i++ soon
  204. case '{': // If open symbol, increase level
  205. level++
  206. case '}': // If close symbol, increase level
  207. level--
  208. // If we have returned to the original level, we're done
  209. if level == 0 {
  210. iter.head = i + 1
  211. lazyBuf = append(lazyBuf, iter.buf[start:iter.head]...)
  212. return &objectLazyAny{baseAny{}, lazyBuf, reusableIter, nil, nil, lazyBuf}
  213. }
  214. }
  215. }
  216. lazyBuf = append(lazyBuf, iter.buf[iter.head:iter.tail]...)
  217. if !iter.loadMore() {
  218. iter.reportError("skipObject", "incomplete object")
  219. return &invalidAny{}
  220. }
  221. }
  222. }
  223. func (iter *Iterator) readArrayAny(reusableIter *Iterator) Any {
  224. level := 1
  225. lazyBuf := make([]byte, 1, 32)
  226. lazyBuf[0] = '['
  227. for {
  228. start := iter.head
  229. for i := iter.head; i < iter.tail; i++ {
  230. switch iter.buf[i] {
  231. case '"': // If inside string, skip it
  232. iter.head = i + 1
  233. iter.skipString()
  234. i = iter.head - 1 // it will be i++ soon
  235. case '[': // If open symbol, increase level
  236. level++
  237. case ']': // If close symbol, increase level
  238. level--
  239. // If we have returned to the original level, we're done
  240. if level == 0 {
  241. iter.head = i + 1
  242. lazyBuf = append(lazyBuf, iter.buf[start:iter.head]...)
  243. return &arrayLazyAny{baseAny{}, lazyBuf, reusableIter, nil, nil, lazyBuf}
  244. }
  245. }
  246. }
  247. lazyBuf = append(lazyBuf, iter.buf[iter.head:iter.tail]...)
  248. if !iter.loadMore() {
  249. iter.reportError("skipArray", "incomplete array")
  250. return &invalidAny{}
  251. }
  252. }
  253. }