feature_any.go 6.8 KB

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