feature_any_object.go 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  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. any.err = iter.Error
  45. return v
  46. }
  47. } else {
  48. any.remaining = nil
  49. any.err = iter.Error
  50. return nil
  51. }
  52. }
  53. for iter.nextToken() == ',' {
  54. k := string(iter.readObjectFieldAsBytes())
  55. v := iter.readAny(iter)
  56. any.cache[k] = v
  57. if target == k {
  58. any.remaining = iter.buf[iter.head:]
  59. any.err = iter.Error
  60. return v
  61. }
  62. }
  63. any.remaining = nil
  64. any.err = iter.Error
  65. return nil
  66. }
  67. func (any *objectLazyAny) fillCache() {
  68. if any.remaining == nil {
  69. return
  70. }
  71. if any.cache == nil {
  72. any.cache = map[string]Any{}
  73. }
  74. iter := any.Parse()
  75. if len(any.remaining) == len(any.buf) {
  76. iter.head++
  77. c := iter.nextToken()
  78. if c != '}' {
  79. iter.unreadByte()
  80. k := string(iter.readObjectFieldAsBytes())
  81. v := iter.readAny(iter)
  82. any.cache[k] = v
  83. } else {
  84. any.remaining = nil
  85. any.err = iter.Error
  86. return
  87. }
  88. }
  89. for iter.nextToken() == ',' {
  90. k := string(iter.readObjectFieldAsBytes())
  91. v := iter.readAny(iter)
  92. any.cache[k] = v
  93. }
  94. any.remaining = nil
  95. any.err = iter.Error
  96. return
  97. }
  98. func (any *objectLazyAny) LastError() error {
  99. return nil
  100. }
  101. func (any *objectLazyAny) ToBool() bool {
  102. if any.cache == nil {
  103. any.IterateObject() // trigger first value read
  104. }
  105. return len(any.cache) != 0
  106. }
  107. func (any *objectLazyAny) ToInt() int {
  108. if any.cache == nil {
  109. any.IterateObject() // trigger first value read
  110. }
  111. if len(any.cache) == 0 {
  112. return 0
  113. }
  114. return 1
  115. }
  116. func (any *objectLazyAny) ToInt32() int32 {
  117. if any.cache == nil {
  118. any.IterateObject() // trigger first value read
  119. }
  120. if len(any.cache) == 0 {
  121. return 0
  122. }
  123. return 1
  124. }
  125. func (any *objectLazyAny) ToInt64() int64 {
  126. if any.cache == nil {
  127. any.IterateObject() // trigger first value read
  128. }
  129. if len(any.cache) == 0 {
  130. return 0
  131. }
  132. return 1
  133. }
  134. func (any *objectLazyAny) ToFloat32() float32 {
  135. if any.cache == nil {
  136. any.IterateObject() // trigger first value read
  137. }
  138. if len(any.cache) == 0 {
  139. return 0
  140. }
  141. return 1
  142. }
  143. func (any *objectLazyAny) ToFloat64() float64 {
  144. if any.cache == nil {
  145. any.IterateObject() // trigger first value read
  146. }
  147. if len(any.cache) == 0 {
  148. return 0
  149. }
  150. return 1
  151. }
  152. func (any *objectLazyAny) ToString() string {
  153. if len(any.remaining) == len(any.buf) {
  154. // nothing has been parsed yet
  155. return *(*string)(unsafe.Pointer(&any.buf))
  156. } else {
  157. any.fillCache()
  158. str, err := MarshalToString(any.cache)
  159. any.err = err
  160. return str
  161. }
  162. }
  163. func (any *objectLazyAny) Get(path ...interface{}) Any {
  164. if len(path) == 0 {
  165. return any
  166. }
  167. if len(path) == 1 {
  168. key := path[0].(string)
  169. return any.fillCacheUntil(key)
  170. } else {
  171. key := path[0].(string)
  172. return any.fillCacheUntil(key).Get(path[1:]...)
  173. }
  174. }
  175. func (any *objectLazyAny) Keys() []string {
  176. any.fillCache()
  177. keys := make([]string, 0, len(any.cache))
  178. for key := range any.cache {
  179. keys = append(keys, key)
  180. }
  181. return keys
  182. }
  183. func (any *objectLazyAny) Size() int {
  184. any.fillCache()
  185. return len(any.cache)
  186. }
  187. func (any *objectLazyAny) IterateObject() (func() (string, Any, bool), bool) {
  188. if any.cache == nil {
  189. any.cache = map[string]Any{}
  190. }
  191. remaining := any.remaining
  192. if len(remaining) == len(any.buf) {
  193. iter := any.Parse()
  194. iter.head++
  195. c := iter.nextToken()
  196. if c != '}' {
  197. iter.unreadByte()
  198. k := string(iter.readObjectFieldAsBytes())
  199. v := iter.readAny(iter)
  200. any.cache[k] = v
  201. remaining = iter.buf[iter.head:]
  202. any.remaining = remaining
  203. } else {
  204. remaining = nil
  205. any.remaining = nil
  206. any.err = iter.Error
  207. return nil, false
  208. }
  209. }
  210. if len(any.cache) == 0 {
  211. return nil, false
  212. }
  213. keys := make([]string, 0, len(any.cache))
  214. values := make([]Any, 0, len(any.cache))
  215. for key, value := range any.cache {
  216. keys = append(keys, key)
  217. values = append(values, value)
  218. }
  219. nextKey := keys[0]
  220. nextValue := values[0]
  221. i := 1
  222. return func() (string, Any, bool) {
  223. key := nextKey
  224. value := nextValue
  225. if i < len(keys) {
  226. // read from cache
  227. nextKey = keys[i]
  228. nextValue = values[i]
  229. i++
  230. return key, value, true
  231. } else {
  232. // read from buffer
  233. iter := any.iter
  234. if iter == nil {
  235. iter = NewIterator()
  236. any.iter = iter
  237. }
  238. iter.ResetBytes(remaining)
  239. c := iter.nextToken()
  240. if c == ',' {
  241. nextKey = string(iter.readObjectFieldAsBytes())
  242. nextValue = iter.readAny(iter)
  243. any.cache[nextKey] = nextValue
  244. remaining = iter.buf[iter.head:]
  245. any.remaining = remaining
  246. any.err = iter.Error
  247. return key, value, true
  248. } else {
  249. remaining = nil
  250. any.remaining = nil
  251. any.err = iter.Error
  252. return key, value, false
  253. }
  254. }
  255. }, true
  256. }
  257. func (any *objectLazyAny) GetObject() map[string]Any {
  258. any.fillCache()
  259. return any.cache
  260. }
  261. func (any *objectLazyAny) SetObject(val map[string]Any) bool {
  262. any.fillCache()
  263. any.cache = val
  264. return true
  265. }
  266. func (any *objectLazyAny) WriteTo(stream *Stream) {
  267. if len(any.remaining) == len(any.buf) {
  268. // nothing has been parsed yet
  269. stream.Write(any.buf)
  270. } else {
  271. any.fillCache()
  272. stream.WriteVal(any.cache)
  273. }
  274. }
  275. func (any *objectLazyAny) GetInterface() interface{} {
  276. any.fillCache()
  277. return any.cache
  278. }