feature_any_object.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. package jsoniter
  2. import (
  3. "unsafe"
  4. )
  5. type objectLazyAny struct {
  6. baseAny
  7. buf []byte
  8. iter *Iterator
  9. err error
  10. cache map[string]Any
  11. remaining []byte
  12. }
  13. func (any *objectLazyAny) parse() *Iterator {
  14. iter := any.iter
  15. if iter == nil {
  16. iter = NewIterator()
  17. any.iter = iter
  18. }
  19. iter.ResetBytes(any.remaining)
  20. return iter
  21. }
  22. func (any *objectLazyAny) fillCacheUntil(target string) Any {
  23. if any.remaining == nil {
  24. return any.cache[target]
  25. }
  26. if any.cache == nil {
  27. any.cache = map[string]Any{}
  28. }
  29. val := any.cache[target]
  30. if val != nil {
  31. return val
  32. }
  33. iter := any.parse()
  34. if len(any.remaining) == len(any.buf) {
  35. iter.head++
  36. c := iter.nextToken()
  37. if c != '}' {
  38. iter.unreadByte()
  39. k := string(iter.readObjectFieldAsBytes())
  40. v := iter.readAny(iter)
  41. any.cache[k] = v
  42. if target == k {
  43. any.remaining = iter.buf[iter.head:]
  44. return v
  45. }
  46. } else {
  47. any.remaining = nil
  48. return nil
  49. }
  50. }
  51. for iter.nextToken() == ',' {
  52. k := string(iter.readObjectFieldAsBytes())
  53. v := iter.readAny(iter)
  54. any.cache[k] = v
  55. if target == k {
  56. any.remaining = iter.buf[iter.head:]
  57. return v
  58. }
  59. }
  60. any.remaining = nil
  61. return nil
  62. }
  63. func (any *objectLazyAny) fillCache() {
  64. if any.remaining == nil {
  65. return
  66. }
  67. if any.cache == nil {
  68. any.cache = map[string]Any{}
  69. }
  70. iter := any.parse()
  71. if len(any.remaining) == len(any.buf) {
  72. iter.head++
  73. c := iter.nextToken()
  74. if c != '}' {
  75. iter.unreadByte()
  76. k := string(iter.readObjectFieldAsBytes())
  77. v := iter.readAny(iter)
  78. any.cache[k] = v
  79. } else {
  80. any.remaining = nil
  81. return
  82. }
  83. }
  84. for iter.nextToken() == ',' {
  85. k := string(iter.readObjectFieldAsBytes())
  86. v := iter.readAny(iter)
  87. any.cache[k] = v
  88. }
  89. any.remaining = nil
  90. return
  91. }
  92. func (any *objectLazyAny) LastError() error {
  93. return nil
  94. }
  95. func (any *objectLazyAny) ToBool() bool {
  96. if any.cache == nil {
  97. any.IterateObject() // trigger first value read
  98. }
  99. return len(any.cache) != 0
  100. }
  101. func (any *objectLazyAny) ToInt() int {
  102. if any.cache == nil {
  103. any.IterateObject() // trigger first value read
  104. }
  105. if len(any.cache) == 0 {
  106. return 0
  107. }
  108. return 1
  109. }
  110. func (any *objectLazyAny) ToInt32() int32 {
  111. if any.cache == nil {
  112. any.IterateObject() // trigger first value read
  113. }
  114. if len(any.cache) == 0 {
  115. return 0
  116. }
  117. return 1
  118. }
  119. func (any *objectLazyAny) ToInt64() int64 {
  120. if any.cache == nil {
  121. any.IterateObject() // trigger first value read
  122. }
  123. if len(any.cache) == 0 {
  124. return 0
  125. }
  126. return 1
  127. }
  128. func (any *objectLazyAny) ToFloat32() float32 {
  129. if any.cache == nil {
  130. any.IterateObject() // trigger first value read
  131. }
  132. if len(any.cache) == 0 {
  133. return 0
  134. }
  135. return 1
  136. }
  137. func (any *objectLazyAny) ToFloat64() float64 {
  138. if any.cache == nil {
  139. any.IterateObject() // trigger first value read
  140. }
  141. if len(any.cache) == 0 {
  142. return 0
  143. }
  144. return 1
  145. }
  146. func (any *objectLazyAny) ToString() string {
  147. if len(any.remaining) == len(any.buf) {
  148. // nothing has been parsed yet
  149. return *(*string)(unsafe.Pointer(&any.buf))
  150. } else {
  151. any.fillCache()
  152. str, err := MarshalToString(any.cache)
  153. any.err = err
  154. return str
  155. }
  156. }
  157. func (any *objectLazyAny) Get(path ...interface{}) Any {
  158. if len(path) == 0 {
  159. return any
  160. }
  161. if len(path) == 1 {
  162. key := path[0].(string)
  163. return any.fillCacheUntil(key)
  164. } else {
  165. key := path[0].(string)
  166. return any.fillCacheUntil(key).Get(path[1:]...)
  167. }
  168. }
  169. func (any *objectLazyAny) Keys() []string {
  170. any.fillCache()
  171. keys := make([]string, 0, len(any.cache))
  172. for key := range any.cache {
  173. keys = append(keys, key)
  174. }
  175. return keys
  176. }
  177. func (any *objectLazyAny) Size() int {
  178. any.fillCache()
  179. return len(any.cache)
  180. }
  181. func (any *objectLazyAny) IterateObject() (func() (string, Any, bool), bool) {
  182. if any.cache == nil {
  183. any.cache = map[string]Any{}
  184. }
  185. remaining := any.remaining
  186. if len(remaining) == len(any.buf) {
  187. iter := any.parse()
  188. iter.head++
  189. c := iter.nextToken()
  190. if c != '}' {
  191. iter.unreadByte()
  192. k := string(iter.readObjectFieldAsBytes())
  193. v := iter.readAny(iter)
  194. any.cache[k] = v
  195. remaining = iter.buf[iter.head:]
  196. any.remaining = remaining
  197. } else {
  198. remaining = nil
  199. any.remaining = nil
  200. return nil, false
  201. }
  202. }
  203. if len(any.cache) == 0 {
  204. return nil, false
  205. }
  206. keys := make([]string, 0, len(any.cache))
  207. values := make([]Any, 0, len(any.cache))
  208. for key, value := range any.cache {
  209. keys = append(keys, key)
  210. values = append(values, value)
  211. }
  212. nextKey := keys[0]
  213. nextValue := values[0]
  214. i := 1
  215. return func() (string, Any, bool) {
  216. key := nextKey
  217. value := nextValue
  218. if i < len(keys) {
  219. // read from cache
  220. nextKey = keys[i]
  221. nextValue = values[i]
  222. i++
  223. return key, value, true
  224. } else {
  225. // read from buffer
  226. iter := any.iter
  227. if iter == nil {
  228. iter = NewIterator()
  229. any.iter = iter
  230. }
  231. iter.ResetBytes(remaining)
  232. c := iter.nextToken()
  233. if c == ',' {
  234. nextKey = string(iter.readObjectFieldAsBytes())
  235. nextValue = iter.readAny(iter)
  236. any.cache[nextKey] = nextValue
  237. remaining = iter.buf[iter.head:]
  238. any.remaining = remaining
  239. return key, value, true
  240. } else {
  241. remaining = nil
  242. any.remaining = nil
  243. return key, value, false
  244. }
  245. }
  246. }, true
  247. }
  248. func (any *objectLazyAny) GetObject() map[string]Any {
  249. any.fillCache()
  250. return any.cache
  251. }
  252. func (any *objectLazyAny) SetObject(val map[string]Any) bool {
  253. any.fillCache()
  254. any.cache = val
  255. return true
  256. }