feature_any_object.go 11 KB

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