feature_any.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. package jsoniter
  2. import (
  3. "fmt"
  4. "reflect"
  5. "io"
  6. )
  7. type Any interface {
  8. LastError() error
  9. ValueType() ValueType
  10. ToBool() bool
  11. ToInt() int
  12. ToInt32() int32
  13. ToInt64() int64
  14. ToUint() uint
  15. ToUint32() uint32
  16. ToUint64() uint64
  17. ToFloat32() float32
  18. ToFloat64() float64
  19. ToString() string
  20. Get(path ...interface{}) Any
  21. Size() int
  22. Keys() []string
  23. GetArray() []Any
  24. GetObject() map[string]Any
  25. GetInterface() interface{}
  26. WriteTo(stream *Stream)
  27. }
  28. type baseAny struct{}
  29. func (any *baseAny) Get(path ...interface{}) Any {
  30. return &invalidAny{baseAny{}, fmt.Errorf("Get %v from simple value", path)}
  31. }
  32. func (any *baseAny) Size() int {
  33. return 0
  34. }
  35. func (any *baseAny) Keys() []string {
  36. return []string{}
  37. }
  38. func (any *baseAny) GetArray() []Any {
  39. return []Any{}
  40. }
  41. func (any *baseAny) GetObject() map[string]Any {
  42. return map[string]Any{}
  43. }
  44. func WrapInt32(val int32) Any {
  45. return &int32Any{baseAny{}, val}
  46. }
  47. func WrapInt64(val int64) Any {
  48. return &int64Any{baseAny{}, val}
  49. }
  50. func WrapUint32(val uint32) Any {
  51. return &uint32Any{baseAny{}, val}
  52. }
  53. func WrapUint64(val uint64) Any {
  54. return &uint64Any{baseAny{}, val}
  55. }
  56. func WrapFloat64(val float64) Any {
  57. return &floatAny{baseAny{}, val}
  58. }
  59. func WrapString(val string) Any {
  60. return &stringAny{baseAny{}, val}
  61. }
  62. func Wrap(val interface{}) Any {
  63. if val == nil {
  64. return &nilAny{}
  65. }
  66. asAny, isAny := val.(Any)
  67. if isAny {
  68. return asAny
  69. }
  70. type_ := reflect.TypeOf(val)
  71. switch type_.Kind() {
  72. case reflect.Slice:
  73. return wrapArray(val)
  74. case reflect.Struct:
  75. return wrapStruct(val)
  76. case reflect.Map:
  77. return wrapMap(val)
  78. case reflect.String:
  79. return WrapString(val.(string))
  80. case reflect.Int:
  81. return WrapInt64(int64(val.(int)))
  82. case reflect.Int8:
  83. return WrapInt32(int32(val.(int8)))
  84. case reflect.Int16:
  85. return WrapInt32(int32(val.(int16)))
  86. case reflect.Int32:
  87. return WrapInt32(val.(int32))
  88. case reflect.Int64:
  89. return WrapInt64(val.(int64))
  90. case reflect.Uint:
  91. return WrapUint64(uint64(val.(uint)))
  92. case reflect.Uint8:
  93. return WrapUint32(uint32(val.(uint8)))
  94. case reflect.Uint16:
  95. return WrapUint32(uint32(val.(uint16)))
  96. case reflect.Uint32:
  97. return WrapUint32(uint32(val.(uint32)))
  98. case reflect.Uint64:
  99. return WrapUint64(val.(uint64))
  100. case reflect.Float32:
  101. return WrapFloat64(float64(val.(float32)))
  102. case reflect.Float64:
  103. return WrapFloat64(val.(float64))
  104. case reflect.Bool:
  105. if val.(bool) == true {
  106. return &trueAny{}
  107. } else {
  108. return &falseAny{}
  109. }
  110. }
  111. return &invalidAny{baseAny{}, fmt.Errorf("unsupported type: %v", type_)}
  112. }
  113. func (iter *Iterator) ReadAny() Any {
  114. return iter.readAny()
  115. }
  116. func (iter *Iterator) readAny() Any {
  117. c := iter.nextToken()
  118. switch c {
  119. case '"':
  120. iter.unreadByte()
  121. return &stringAny{baseAny{}, iter.ReadString()}
  122. case 'n':
  123. iter.skipFixedBytes(3) // null
  124. return &nilAny{}
  125. case 't':
  126. iter.skipFixedBytes(3) // true
  127. return &trueAny{}
  128. case 'f':
  129. iter.skipFixedBytes(4) // false
  130. return &falseAny{}
  131. case '{':
  132. return iter.readObjectAny()
  133. case '[':
  134. return iter.readArrayAny()
  135. case '-':
  136. return iter.readNumberAny(false)
  137. default:
  138. return iter.readNumberAny(true)
  139. }
  140. }
  141. func (iter *Iterator) readNumberAny(positive bool) Any {
  142. iter.startCapture(iter.head - 1)
  143. dotFound := iter.skipNumberAndTellDotFoundOrNot()
  144. lazyBuf := iter.stopCapture()
  145. if dotFound {
  146. return &float64LazyAny{baseAny{}, iter.cfg, lazyBuf, nil, 0}
  147. } else {
  148. if positive {
  149. return &uint64LazyAny{baseAny{}, iter.cfg, lazyBuf, nil, 0}
  150. } else {
  151. return &int64LazyAny{baseAny{}, iter.cfg, lazyBuf, nil, 0}
  152. }
  153. }
  154. }
  155. func (iter *Iterator) readObjectAny() Any {
  156. iter.startCapture(iter.head - 1)
  157. iter.skipObject()
  158. lazyBuf := iter.stopCapture()
  159. return &objectLazyAny{baseAny{}, iter.cfg, lazyBuf, nil}
  160. }
  161. func (iter *Iterator) readArrayAny() Any {
  162. iter.startCapture(iter.head - 1)
  163. iter.skipArray()
  164. lazyBuf := iter.stopCapture()
  165. return &arrayLazyAny{baseAny{}, iter.cfg, lazyBuf, nil}
  166. }
  167. func locateObjectField(iter *Iterator, target string) []byte {
  168. var found []byte
  169. iter.ReadObjectCB(func(iter *Iterator, field string) bool {
  170. if field == target {
  171. found = iter.SkipAndReturnBytes()
  172. return false
  173. }
  174. iter.Skip()
  175. return true
  176. })
  177. return found
  178. }
  179. func locateArrayElement(iter *Iterator, target int) []byte {
  180. var found []byte
  181. n := 0
  182. iter.ReadArrayCB(func(iter *Iterator) bool {
  183. if n == target {
  184. found = iter.SkipAndReturnBytes()
  185. return false
  186. }
  187. iter.Skip()
  188. n++
  189. return true
  190. })
  191. return found
  192. }
  193. func locatePath(iter *Iterator, path []interface{}) Any {
  194. for i, pathKeyObj := range path {
  195. switch pathKey := pathKeyObj.(type) {
  196. case string:
  197. valueBytes := locateObjectField(iter, pathKey)
  198. iter.ResetBytes(valueBytes)
  199. case int:
  200. valueBytes := locateArrayElement(iter, pathKey)
  201. iter.ResetBytes(valueBytes)
  202. case int32:
  203. if '*' == pathKey {
  204. return iter.readAny().Get(path[i:]...)
  205. } else {
  206. return newInvalidAny(path)
  207. }
  208. default:
  209. return newInvalidAny(path[i:])
  210. }
  211. }
  212. if iter.Error != nil && iter.Error != io.EOF {
  213. return &invalidAny{baseAny{}, iter.Error}
  214. }
  215. return iter.readAny()
  216. }