feature_any_object.go 6.0 KB

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