feature_any_object.go 4.2 KB

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