feature_any_object.go 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492
  1. package jsoniter
  2. import (
  3. "reflect"
  4. "unsafe"
  5. )
  6. type objectLazyAny struct {
  7. baseAny
  8. cfg *frozenConfig
  9. buf []byte
  10. err error
  11. }
  12. func (any *objectLazyAny) ValueType() ValueType {
  13. return Object
  14. }
  15. func (any *objectLazyAny) MustBeValid() Any {
  16. return any
  17. }
  18. func (any *objectLazyAny) LastError() error {
  19. return any.err
  20. }
  21. func (any *objectLazyAny) ToBool() bool {
  22. iter := any.cfg.BorrowIterator(any.buf)
  23. defer any.cfg.ReturnIterator(iter)
  24. return iter.ReadObject() != ""
  25. }
  26. func (any *objectLazyAny) ToInt() int {
  27. if any.ToBool() {
  28. return 1
  29. } else {
  30. return 0
  31. }
  32. }
  33. func (any *objectLazyAny) ToInt32() int32 {
  34. if any.ToBool() {
  35. return 1
  36. } else {
  37. return 0
  38. }
  39. }
  40. func (any *objectLazyAny) ToInt64() int64 {
  41. if any.ToBool() {
  42. return 1
  43. } else {
  44. return 0
  45. }
  46. }
  47. func (any *objectLazyAny) ToUint() uint {
  48. if any.ToBool() {
  49. return 1
  50. } else {
  51. return 0
  52. }
  53. }
  54. func (any *objectLazyAny) ToUint32() uint32 {
  55. if any.ToBool() {
  56. return 1
  57. } else {
  58. return 0
  59. }
  60. }
  61. func (any *objectLazyAny) ToUint64() uint64 {
  62. if any.ToBool() {
  63. return 1
  64. } else {
  65. return 0
  66. }
  67. }
  68. func (any *objectLazyAny) ToFloat32() float32 {
  69. if any.ToBool() {
  70. return 1
  71. } else {
  72. return 0
  73. }
  74. }
  75. func (any *objectLazyAny) ToFloat64() float64 {
  76. if any.ToBool() {
  77. return 1
  78. } else {
  79. return 0
  80. }
  81. }
  82. func (any *objectLazyAny) ToString() string {
  83. return *(*string)(unsafe.Pointer(&any.buf))
  84. }
  85. func (any *objectLazyAny) ToVal(obj interface{}) {
  86. iter := any.cfg.BorrowIterator(any.buf)
  87. defer any.cfg.ReturnIterator(iter)
  88. iter.ReadVal(obj)
  89. }
  90. func (any *objectLazyAny) Get(path ...interface{}) Any {
  91. if len(path) == 0 {
  92. return any
  93. }
  94. switch firstPath := path[0].(type) {
  95. case string:
  96. iter := any.cfg.BorrowIterator(any.buf)
  97. defer any.cfg.ReturnIterator(iter)
  98. valueBytes := locateObjectField(iter, firstPath)
  99. if valueBytes == nil {
  100. return newInvalidAny(path)
  101. } else {
  102. iter.ResetBytes(valueBytes)
  103. return locatePath(iter, path[1:])
  104. }
  105. case int32:
  106. if '*' == firstPath {
  107. mappedAll := map[string]Any{}
  108. iter := any.cfg.BorrowIterator(any.buf)
  109. defer any.cfg.ReturnIterator(iter)
  110. iter.ReadObjectCB(func(iter *Iterator, field string) bool {
  111. mapped := locatePath(iter, path[1:])
  112. if mapped.ValueType() != Invalid {
  113. mappedAll[field] = mapped
  114. }
  115. return true
  116. })
  117. return wrapMap(mappedAll)
  118. } else {
  119. return newInvalidAny(path)
  120. }
  121. default:
  122. return newInvalidAny(path)
  123. }
  124. }
  125. func (any *objectLazyAny) Keys() []string {
  126. keys := []string{}
  127. iter := any.cfg.BorrowIterator(any.buf)
  128. defer any.cfg.ReturnIterator(iter)
  129. iter.ReadObjectCB(func(iter *Iterator, field string) bool {
  130. iter.Skip()
  131. keys = append(keys, field)
  132. return true
  133. })
  134. return keys
  135. }
  136. func (any *objectLazyAny) Size() int {
  137. size := 0
  138. iter := any.cfg.BorrowIterator(any.buf)
  139. defer any.cfg.ReturnIterator(iter)
  140. iter.ReadObjectCB(func(iter *Iterator, field string) bool {
  141. iter.Skip()
  142. size++
  143. return true
  144. })
  145. return size
  146. }
  147. func (any *objectLazyAny) GetObject() map[string]Any {
  148. asMap := map[string]Any{}
  149. iter := any.cfg.BorrowIterator(any.buf)
  150. defer any.cfg.ReturnIterator(iter)
  151. iter.ReadObjectCB(func(iter *Iterator, field string) bool {
  152. asMap[field] = iter.ReadAny()
  153. return true
  154. })
  155. return asMap
  156. }
  157. func (any *objectLazyAny) WriteTo(stream *Stream) {
  158. stream.Write(any.buf)
  159. }
  160. func (any *objectLazyAny) GetInterface() interface{} {
  161. iter := any.cfg.BorrowIterator(any.buf)
  162. defer any.cfg.ReturnIterator(iter)
  163. return iter.Read()
  164. }
  165. type objectAny struct {
  166. baseAny
  167. err error
  168. val reflect.Value
  169. }
  170. func wrapStruct(val interface{}) *objectAny {
  171. return &objectAny{baseAny{}, nil, reflect.ValueOf(val)}
  172. }
  173. func (any *objectAny) ValueType() ValueType {
  174. return Object
  175. }
  176. func (any *objectAny) MustBeValid() Any {
  177. return any
  178. }
  179. func (any *objectAny) Parse() *Iterator {
  180. return nil
  181. }
  182. func (any *objectAny) LastError() error {
  183. return any.err
  184. }
  185. func (any *objectAny) ToBool() bool {
  186. return any.val.NumField() != 0
  187. }
  188. func (any *objectAny) ToInt() int {
  189. if any.val.NumField() == 0 {
  190. return 0
  191. }
  192. return 1
  193. }
  194. func (any *objectAny) ToInt32() int32 {
  195. if any.val.NumField() == 0 {
  196. return 0
  197. }
  198. return 1
  199. }
  200. func (any *objectAny) ToInt64() int64 {
  201. if any.val.NumField() == 0 {
  202. return 0
  203. }
  204. return 1
  205. }
  206. func (any *objectAny) ToUint() uint {
  207. if any.val.NumField() == 0 {
  208. return 0
  209. }
  210. return 1
  211. }
  212. func (any *objectAny) ToUint32() uint32 {
  213. if any.val.NumField() == 0 {
  214. return 0
  215. }
  216. return 1
  217. }
  218. func (any *objectAny) ToUint64() uint64 {
  219. if any.val.NumField() == 0 {
  220. return 0
  221. }
  222. return 1
  223. }
  224. func (any *objectAny) ToFloat32() float32 {
  225. if any.val.NumField() == 0 {
  226. return 0
  227. }
  228. return 1
  229. }
  230. func (any *objectAny) ToFloat64() float64 {
  231. if any.val.NumField() == 0 {
  232. return 0
  233. }
  234. return 1
  235. }
  236. func (any *objectAny) ToString() string {
  237. str, err := MarshalToString(any.val.Interface())
  238. any.err = err
  239. return str
  240. }
  241. func (any *objectAny) Get(path ...interface{}) Any {
  242. if len(path) == 0 {
  243. return any
  244. }
  245. switch firstPath := path[0].(type) {
  246. case string:
  247. field := any.val.FieldByName(firstPath)
  248. if !field.IsValid() {
  249. return newInvalidAny(path)
  250. }
  251. return Wrap(field.Interface())
  252. case int32:
  253. if '*' == firstPath {
  254. mappedAll := map[string]Any{}
  255. for i := 0; i < any.val.NumField(); i++ {
  256. field := any.val.Field(i)
  257. if field.CanInterface() {
  258. mapped := Wrap(field.Interface()).Get(path[1:]...)
  259. if mapped.ValueType() != Invalid {
  260. mappedAll[any.val.Type().Field(i).Name] = mapped
  261. }
  262. }
  263. }
  264. return wrapMap(mappedAll)
  265. } else {
  266. return newInvalidAny(path)
  267. }
  268. default:
  269. return newInvalidAny(path)
  270. }
  271. }
  272. func (any *objectAny) Keys() []string {
  273. keys := make([]string, 0, any.val.NumField())
  274. for i := 0; i < any.val.NumField(); i++ {
  275. keys = append(keys, any.val.Type().Field(i).Name)
  276. }
  277. return keys
  278. }
  279. func (any *objectAny) Size() int {
  280. return any.val.NumField()
  281. }
  282. func (any *objectAny) GetObject() map[string]Any {
  283. object := map[string]Any{}
  284. for i := 0; i < any.val.NumField(); i++ {
  285. field := any.val.Field(i)
  286. if field.CanInterface() {
  287. object[any.val.Type().Field(i).Name] = Wrap(field.Interface())
  288. }
  289. }
  290. return object
  291. }
  292. func (any *objectAny) WriteTo(stream *Stream) {
  293. stream.WriteVal(any.val)
  294. }
  295. func (any *objectAny) GetInterface() interface{} {
  296. return any.val.Interface()
  297. }
  298. type mapAny struct {
  299. baseAny
  300. err error
  301. val reflect.Value
  302. }
  303. func wrapMap(val interface{}) *mapAny {
  304. return &mapAny{baseAny{}, nil, reflect.ValueOf(val)}
  305. }
  306. func (any *mapAny) ValueType() ValueType {
  307. return Object
  308. }
  309. func (any *mapAny) MustBeValid() Any {
  310. return any
  311. }
  312. func (any *mapAny) Parse() *Iterator {
  313. return nil
  314. }
  315. func (any *mapAny) LastError() error {
  316. return any.err
  317. }
  318. func (any *mapAny) ToBool() bool {
  319. return any.val.Len() != 0
  320. }
  321. func (any *mapAny) ToInt() int {
  322. if any.val.Len() == 0 {
  323. return 0
  324. }
  325. return 1
  326. }
  327. func (any *mapAny) ToInt32() int32 {
  328. if any.val.Len() == 0 {
  329. return 0
  330. }
  331. return 1
  332. }
  333. func (any *mapAny) ToInt64() int64 {
  334. if any.val.Len() == 0 {
  335. return 0
  336. }
  337. return 1
  338. }
  339. func (any *mapAny) ToUint() uint {
  340. if any.val.Len() == 0 {
  341. return 0
  342. }
  343. return 1
  344. }
  345. func (any *mapAny) ToUint32() uint32 {
  346. if any.val.Len() == 0 {
  347. return 0
  348. }
  349. return 1
  350. }
  351. func (any *mapAny) ToUint64() uint64 {
  352. if any.val.Len() == 0 {
  353. return 0
  354. }
  355. return 1
  356. }
  357. func (any *mapAny) ToFloat32() float32 {
  358. if any.val.Len() == 0 {
  359. return 0
  360. }
  361. return 1
  362. }
  363. func (any *mapAny) ToFloat64() float64 {
  364. if any.val.Len() == 0 {
  365. return 0
  366. }
  367. return 1
  368. }
  369. func (any *mapAny) ToString() string {
  370. str, err := MarshalToString(any.val.Interface())
  371. any.err = err
  372. return str
  373. }
  374. func (any *mapAny) Get(path ...interface{}) Any {
  375. if len(path) == 0 {
  376. return any
  377. }
  378. switch firstPath := path[0].(type) {
  379. case int32:
  380. if '*' == firstPath {
  381. mappedAll := map[string]Any{}
  382. for _, key := range any.val.MapKeys() {
  383. keyAsStr := key.String()
  384. element := Wrap(any.val.MapIndex(key).Interface())
  385. mapped := element.Get(path[1:]...)
  386. if mapped.ValueType() != Invalid {
  387. mappedAll[keyAsStr] = mapped
  388. }
  389. }
  390. return wrapMap(mappedAll)
  391. } else {
  392. return newInvalidAny(path)
  393. }
  394. default:
  395. value := any.val.MapIndex(reflect.ValueOf(firstPath))
  396. if !value.IsValid() {
  397. return newInvalidAny(path)
  398. }
  399. return Wrap(value.Interface())
  400. }
  401. }
  402. func (any *mapAny) Keys() []string {
  403. keys := make([]string, 0, any.val.Len())
  404. for _, key := range any.val.MapKeys() {
  405. keys = append(keys, key.String())
  406. }
  407. return keys
  408. }
  409. func (any *mapAny) Size() int {
  410. return any.val.Len()
  411. }
  412. func (any *mapAny) GetObject() map[string]Any {
  413. object := map[string]Any{}
  414. for _, key := range any.val.MapKeys() {
  415. keyAsStr := key.String()
  416. element := Wrap(any.val.MapIndex(key).Interface())
  417. object[keyAsStr] = element
  418. }
  419. return object
  420. }
  421. func (any *mapAny) WriteTo(stream *Stream) {
  422. stream.WriteVal(any.val)
  423. }
  424. func (any *mapAny) GetInterface() interface{} {
  425. return any.val.Interface()
  426. }