feature_any_object.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837
  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. cache map[string]Any
  13. remaining []byte
  14. }
  15. func (any *objectLazyAny) ValueType() ValueType {
  16. return Object
  17. }
  18. func (any *objectLazyAny) fillCacheUntil(target string) Any {
  19. if any.remaining == nil {
  20. return any.cache[target]
  21. }
  22. if any.cache == nil {
  23. any.cache = map[string]Any{}
  24. }
  25. val := any.cache[target]
  26. if val != nil {
  27. return val
  28. }
  29. iter := any.cfg.BorrowIterator(any.remaining)
  30. defer any.cfg.ReturnIterator(iter)
  31. if len(any.remaining) == len(any.buf) {
  32. iter.head++
  33. c := iter.nextToken()
  34. if c != '}' {
  35. iter.unreadByte()
  36. k := string(iter.readObjectFieldAsBytes())
  37. v := iter.readAny()
  38. any.cache[k] = v
  39. if target == k {
  40. any.remaining = iter.buf[iter.head:]
  41. any.err = iter.Error
  42. return v
  43. }
  44. } else {
  45. any.remaining = nil
  46. any.err = iter.Error
  47. return nil
  48. }
  49. }
  50. for iter.nextToken() == ',' {
  51. k := string(iter.readObjectFieldAsBytes())
  52. v := iter.readAny()
  53. any.cache[k] = v
  54. if target == k {
  55. any.remaining = iter.buf[iter.head:]
  56. any.err = iter.Error
  57. return v
  58. }
  59. }
  60. any.remaining = nil
  61. any.err = iter.Error
  62. return nil
  63. }
  64. func (any *objectLazyAny) fillCache() {
  65. if any.remaining == nil {
  66. return
  67. }
  68. if any.cache == nil {
  69. any.cache = map[string]Any{}
  70. }
  71. iter := any.cfg.BorrowIterator(any.remaining)
  72. defer any.cfg.ReturnIterator(iter)
  73. if len(any.remaining) == len(any.buf) {
  74. iter.head++
  75. c := iter.nextToken()
  76. if c != '}' {
  77. iter.unreadByte()
  78. k := string(iter.readObjectFieldAsBytes())
  79. v := iter.readAny()
  80. any.cache[k] = v
  81. } else {
  82. any.remaining = nil
  83. any.err = iter.Error
  84. return
  85. }
  86. }
  87. for iter.nextToken() == ',' {
  88. k := string(iter.readObjectFieldAsBytes())
  89. v := iter.readAny()
  90. any.cache[k] = v
  91. }
  92. any.remaining = nil
  93. any.err = iter.Error
  94. return
  95. }
  96. func (any *objectLazyAny) LastError() error {
  97. return any.err
  98. }
  99. func (any *objectLazyAny) ToBool() bool {
  100. if any.cache == nil {
  101. any.IterateObject() // trigger first value read
  102. }
  103. return len(any.cache) != 0
  104. }
  105. func (any *objectLazyAny) ToInt() int {
  106. if any.cache == nil {
  107. any.IterateObject() // trigger first value read
  108. }
  109. if len(any.cache) == 0 {
  110. return 0
  111. }
  112. return 1
  113. }
  114. func (any *objectLazyAny) ToInt32() int32 {
  115. if any.cache == nil {
  116. any.IterateObject() // trigger first value read
  117. }
  118. if len(any.cache) == 0 {
  119. return 0
  120. }
  121. return 1
  122. }
  123. func (any *objectLazyAny) ToInt64() int64 {
  124. if any.cache == nil {
  125. any.IterateObject() // trigger first value read
  126. }
  127. if len(any.cache) == 0 {
  128. return 0
  129. }
  130. return 1
  131. }
  132. func (any *objectLazyAny) ToUint() uint {
  133. if any.cache == nil {
  134. any.IterateObject() // trigger first value read
  135. }
  136. if len(any.cache) == 0 {
  137. return 0
  138. }
  139. return 1
  140. }
  141. func (any *objectLazyAny) ToUint32() uint32 {
  142. if any.cache == nil {
  143. any.IterateObject() // trigger first value read
  144. }
  145. if len(any.cache) == 0 {
  146. return 0
  147. }
  148. return 1
  149. }
  150. func (any *objectLazyAny) ToUint64() uint64 {
  151. if any.cache == nil {
  152. any.IterateObject() // trigger first value read
  153. }
  154. if len(any.cache) == 0 {
  155. return 0
  156. }
  157. return 1
  158. }
  159. func (any *objectLazyAny) ToFloat32() float32 {
  160. if any.cache == nil {
  161. any.IterateObject() // trigger first value read
  162. }
  163. if len(any.cache) == 0 {
  164. return 0
  165. }
  166. return 1
  167. }
  168. func (any *objectLazyAny) ToFloat64() float64 {
  169. if any.cache == nil {
  170. any.IterateObject() // trigger first value read
  171. }
  172. if len(any.cache) == 0 {
  173. return 0
  174. }
  175. return 1
  176. }
  177. func (any *objectLazyAny) ToString() string {
  178. if len(any.remaining) == len(any.buf) {
  179. // nothing has been parsed yet
  180. return *(*string)(unsafe.Pointer(&any.buf))
  181. } else {
  182. any.fillCache()
  183. str, err := MarshalToString(any.cache)
  184. any.err = err
  185. return str
  186. }
  187. }
  188. func (any *objectLazyAny) Get(path ...interface{}) Any {
  189. if len(path) == 0 {
  190. return any
  191. }
  192. var element Any
  193. switch firstPath := path[0].(type) {
  194. case string:
  195. element = any.fillCacheUntil(firstPath)
  196. if element == nil {
  197. element = &invalidAny{baseAny{}, fmt.Errorf("%v not found in %v", firstPath, any.cache)}
  198. }
  199. case int32:
  200. if '*' == firstPath {
  201. any.fillCache()
  202. mappedAll := map[string]Any{}
  203. for key, value := range any.cache {
  204. mapped := value.Get(path[1:]...)
  205. if mapped.ValueType() != Invalid {
  206. mappedAll[key] = mapped
  207. }
  208. }
  209. return wrapMap(mappedAll)
  210. } else {
  211. element = &invalidAny{baseAny{}, fmt.Errorf("%v not found in %v", firstPath, any.cache)}
  212. }
  213. default:
  214. element = &invalidAny{baseAny{}, fmt.Errorf("%v not found in %v", firstPath, any.cache)}
  215. }
  216. if len(path) == 1 {
  217. return element
  218. } else {
  219. return element.Get(path[1:]...)
  220. }
  221. }
  222. func (any *objectLazyAny) Keys() []string {
  223. any.fillCache()
  224. keys := make([]string, 0, len(any.cache))
  225. for key := range any.cache {
  226. keys = append(keys, key)
  227. }
  228. return keys
  229. }
  230. func (any *objectLazyAny) Size() int {
  231. any.fillCache()
  232. return len(any.cache)
  233. }
  234. func (any *objectLazyAny) IterateObject() (func() (string, Any, bool), bool) {
  235. if any.cache == nil {
  236. any.cache = map[string]Any{}
  237. }
  238. remaining := any.remaining
  239. if len(remaining) == len(any.buf) {
  240. iter := any.cfg.BorrowIterator(any.remaining)
  241. defer any.cfg.ReturnIterator(iter)
  242. iter.head++
  243. c := iter.nextToken()
  244. if c != '}' {
  245. iter.unreadByte()
  246. k := string(iter.readObjectFieldAsBytes())
  247. v := iter.readAny()
  248. any.cache[k] = v
  249. remaining = iter.buf[iter.head:]
  250. any.remaining = remaining
  251. } else {
  252. remaining = nil
  253. any.remaining = nil
  254. any.err = iter.Error
  255. return nil, false
  256. }
  257. }
  258. if len(any.cache) == 0 {
  259. return nil, false
  260. }
  261. keys := make([]string, 0, len(any.cache))
  262. values := make([]Any, 0, len(any.cache))
  263. for key, value := range any.cache {
  264. keys = append(keys, key)
  265. values = append(values, value)
  266. }
  267. nextKey := keys[0]
  268. nextValue := values[0]
  269. i := 1
  270. return func() (string, Any, bool) {
  271. key := nextKey
  272. value := nextValue
  273. if i < len(keys) {
  274. // read from cache
  275. nextKey = keys[i]
  276. nextValue = values[i]
  277. i++
  278. return key, value, true
  279. } else {
  280. // read from buffer
  281. iter := any.cfg.BorrowIterator(any.remaining)
  282. defer any.cfg.ReturnIterator(iter)
  283. c := iter.nextToken()
  284. if c == ',' {
  285. nextKey = string(iter.readObjectFieldAsBytes())
  286. nextValue = iter.readAny()
  287. any.cache[nextKey] = nextValue
  288. remaining = iter.buf[iter.head:]
  289. any.remaining = remaining
  290. any.err = iter.Error
  291. return key, value, true
  292. } else {
  293. nextKey = ""
  294. remaining = nil
  295. any.remaining = nil
  296. any.err = iter.Error
  297. return key, value, false
  298. }
  299. }
  300. }, true
  301. }
  302. func (any *objectLazyAny) GetObject() map[string]Any {
  303. any.fillCache()
  304. return any.cache
  305. }
  306. func (any *objectLazyAny) SetObject(val map[string]Any) bool {
  307. any.fillCache()
  308. any.cache = val
  309. return true
  310. }
  311. func (any *objectLazyAny) WriteTo(stream *Stream) {
  312. if len(any.remaining) == len(any.buf) {
  313. // nothing has been parsed yet
  314. stream.Write(any.buf)
  315. } else {
  316. any.fillCache()
  317. stream.WriteVal(any.cache)
  318. }
  319. }
  320. func (any *objectLazyAny) GetInterface() interface{} {
  321. any.fillCache()
  322. return any.cache
  323. }
  324. type objectAny struct {
  325. baseAny
  326. err error
  327. cache map[string]Any
  328. val reflect.Value
  329. }
  330. func wrapStruct(val interface{}) *objectAny {
  331. return &objectAny{baseAny{}, nil, nil, reflect.ValueOf(val)}
  332. }
  333. func (any *objectAny) ValueType() ValueType {
  334. return Object
  335. }
  336. func (any *objectAny) Parse() *Iterator {
  337. return nil
  338. }
  339. func (any *objectAny) fillCacheUntil(target string) Any {
  340. if any.cache == nil {
  341. any.cache = map[string]Any{}
  342. }
  343. element, found := any.cache[target]
  344. if found {
  345. return element
  346. }
  347. for i := len(any.cache); i < any.val.NumField(); i++ {
  348. field := any.val.Field(i)
  349. fieldName := any.val.Type().Field(i).Name
  350. var element Any
  351. if field.CanInterface() {
  352. element = Wrap(field.Interface())
  353. } else {
  354. element = &invalidAny{baseAny{}, fmt.Errorf("%v not found in %v", fieldName, any.cache)}
  355. }
  356. any.cache[fieldName] = element
  357. if fieldName == target {
  358. return element
  359. }
  360. }
  361. return nil
  362. }
  363. func (any *objectAny) fillCache() {
  364. if any.cache == nil {
  365. any.cache = map[string]Any{}
  366. }
  367. if len(any.cache) == any.val.NumField() {
  368. return
  369. }
  370. for i := 0; i < any.val.NumField(); i++ {
  371. field := any.val.Field(i)
  372. fieldName := any.val.Type().Field(i).Name
  373. var element Any
  374. if field.CanInterface() {
  375. element = Wrap(field.Interface())
  376. } else {
  377. element = &invalidAny{baseAny{}, fmt.Errorf("%v not found in %v", fieldName, any.cache)}
  378. }
  379. any.cache[fieldName] = element
  380. }
  381. }
  382. func (any *objectAny) LastError() error {
  383. return any.err
  384. }
  385. func (any *objectAny) ToBool() bool {
  386. return any.val.NumField() != 0
  387. }
  388. func (any *objectAny) ToInt() int {
  389. if any.val.NumField() == 0 {
  390. return 0
  391. }
  392. return 1
  393. }
  394. func (any *objectAny) ToInt32() int32 {
  395. if any.val.NumField() == 0 {
  396. return 0
  397. }
  398. return 1
  399. }
  400. func (any *objectAny) ToInt64() int64 {
  401. if any.val.NumField() == 0 {
  402. return 0
  403. }
  404. return 1
  405. }
  406. func (any *objectAny) ToUint() uint {
  407. if any.val.NumField() == 0 {
  408. return 0
  409. }
  410. return 1
  411. }
  412. func (any *objectAny) ToUint32() uint32 {
  413. if any.val.NumField() == 0 {
  414. return 0
  415. }
  416. return 1
  417. }
  418. func (any *objectAny) ToUint64() uint64 {
  419. if any.val.NumField() == 0 {
  420. return 0
  421. }
  422. return 1
  423. }
  424. func (any *objectAny) ToFloat32() float32 {
  425. if any.val.NumField() == 0 {
  426. return 0
  427. }
  428. return 1
  429. }
  430. func (any *objectAny) ToFloat64() float64 {
  431. if any.val.NumField() == 0 {
  432. return 0
  433. }
  434. return 1
  435. }
  436. func (any *objectAny) ToString() string {
  437. if len(any.cache) == 0 {
  438. str, err := MarshalToString(any.val.Interface())
  439. any.err = err
  440. return str
  441. } else {
  442. any.fillCache()
  443. str, err := MarshalToString(any.cache)
  444. any.err = err
  445. return str
  446. }
  447. }
  448. func (any *objectAny) Get(path ...interface{}) Any {
  449. if len(path) == 0 {
  450. return any
  451. }
  452. var element Any
  453. switch firstPath := path[0].(type) {
  454. case string:
  455. element = any.fillCacheUntil(firstPath)
  456. if element == nil {
  457. element = &invalidAny{baseAny{}, fmt.Errorf("%v not found in %v", firstPath, any.cache)}
  458. }
  459. case int32:
  460. if '*' == firstPath {
  461. any.fillCache()
  462. mappedAll := map[string]Any{}
  463. for key, value := range any.cache {
  464. mapped := value.Get(path[1:]...)
  465. if mapped.ValueType() != Invalid {
  466. mappedAll[key] = mapped
  467. }
  468. }
  469. return wrapMap(mappedAll)
  470. } else {
  471. element = &invalidAny{baseAny{}, fmt.Errorf("%v not found in %v", firstPath, any.cache)}
  472. }
  473. default:
  474. element = &invalidAny{baseAny{}, fmt.Errorf("%v not found in %v", firstPath, any.cache)}
  475. }
  476. if len(path) == 1 {
  477. return element
  478. } else {
  479. return element.Get(path[1:]...)
  480. }
  481. }
  482. func (any *objectAny) Keys() []string {
  483. any.fillCache()
  484. keys := make([]string, 0, len(any.cache))
  485. for key := range any.cache {
  486. keys = append(keys, key)
  487. }
  488. return keys
  489. }
  490. func (any *objectAny) Size() int {
  491. any.fillCache()
  492. return len(any.cache)
  493. }
  494. func (any *objectAny) IterateObject() (func() (string, Any, bool), bool) {
  495. if any.cache == nil {
  496. any.cache = map[string]Any{}
  497. }
  498. if any.val.NumField() == 0 {
  499. return nil, false
  500. }
  501. cacheKeys := make([]string, len(any.cache))
  502. i := 0
  503. for key := range any.cache {
  504. cacheKeys[i] = key
  505. i++
  506. }
  507. i = 0
  508. return func() (string, Any, bool) {
  509. if i == any.val.NumField() {
  510. return "", nil, false
  511. }
  512. var fieldName string
  513. var fieldValueAsAny Any
  514. if i == len(cacheKeys) {
  515. fieldName = any.val.Type().Field(i).Name
  516. cacheKeys = append(cacheKeys, fieldName)
  517. fieldValue := any.val.Field(i)
  518. if fieldValue.CanInterface() {
  519. fieldValueAsAny = Wrap(fieldValue.Interface())
  520. any.cache[fieldName] = fieldValueAsAny
  521. } else {
  522. fieldValueAsAny = &invalidAny{baseAny{}, fmt.Errorf("%v not found in %v", fieldName, any.cache)}
  523. any.cache[fieldName] = fieldValueAsAny
  524. }
  525. } else {
  526. fieldName = cacheKeys[i]
  527. fieldValueAsAny = any.cache[fieldName]
  528. }
  529. i++
  530. return fieldName, fieldValueAsAny, i != any.val.NumField()
  531. }, true
  532. }
  533. func (any *objectAny) GetObject() map[string]Any {
  534. any.fillCache()
  535. return any.cache
  536. }
  537. func (any *objectAny) SetObject(val map[string]Any) bool {
  538. any.fillCache()
  539. any.cache = val
  540. return true
  541. }
  542. func (any *objectAny) WriteTo(stream *Stream) {
  543. if len(any.cache) == 0 {
  544. // nothing has been parsed yet
  545. stream.WriteVal(any.val)
  546. } else {
  547. any.fillCache()
  548. stream.WriteVal(any.cache)
  549. }
  550. }
  551. func (any *objectAny) GetInterface() interface{} {
  552. any.fillCache()
  553. return any.cache
  554. }
  555. type mapAny struct {
  556. baseAny
  557. err error
  558. cache map[string]Any
  559. val reflect.Value
  560. }
  561. func wrapMap(val interface{}) *mapAny {
  562. return &mapAny{baseAny{}, nil, nil, reflect.ValueOf(val)}
  563. }
  564. func (any *mapAny) ValueType() ValueType {
  565. return Object
  566. }
  567. func (any *mapAny) Parse() *Iterator {
  568. return nil
  569. }
  570. func (any *mapAny) fillCacheUntil(target string) Any {
  571. if any.cache == nil {
  572. any.cache = map[string]Any{}
  573. }
  574. element, found := any.cache[target]
  575. if found {
  576. return element
  577. }
  578. for _, key := range any.val.MapKeys() {
  579. keyAsStr := key.String()
  580. _, found := any.cache[keyAsStr]
  581. if found {
  582. continue
  583. }
  584. element := Wrap(any.val.MapIndex(key).Interface())
  585. any.cache[keyAsStr] = element
  586. if keyAsStr == target {
  587. return element
  588. }
  589. }
  590. return nil
  591. }
  592. func (any *mapAny) fillCache() {
  593. if any.cache == nil {
  594. any.cache = map[string]Any{}
  595. }
  596. if len(any.cache) == any.val.Len() {
  597. return
  598. }
  599. for _, key := range any.val.MapKeys() {
  600. keyAsStr := key.String()
  601. element := Wrap(any.val.MapIndex(key).Interface())
  602. any.cache[keyAsStr] = element
  603. }
  604. }
  605. func (any *mapAny) LastError() error {
  606. return any.err
  607. }
  608. func (any *mapAny) ToBool() bool {
  609. return any.val.Len() != 0
  610. }
  611. func (any *mapAny) ToInt() int {
  612. if any.val.Len() == 0 {
  613. return 0
  614. }
  615. return 1
  616. }
  617. func (any *mapAny) ToInt32() int32 {
  618. if any.val.Len() == 0 {
  619. return 0
  620. }
  621. return 1
  622. }
  623. func (any *mapAny) ToInt64() int64 {
  624. if any.val.Len() == 0 {
  625. return 0
  626. }
  627. return 1
  628. }
  629. func (any *mapAny) ToUint() uint {
  630. if any.val.Len() == 0 {
  631. return 0
  632. }
  633. return 1
  634. }
  635. func (any *mapAny) ToUint32() uint32 {
  636. if any.val.Len() == 0 {
  637. return 0
  638. }
  639. return 1
  640. }
  641. func (any *mapAny) ToUint64() uint64 {
  642. if any.val.Len() == 0 {
  643. return 0
  644. }
  645. return 1
  646. }
  647. func (any *mapAny) ToFloat32() float32 {
  648. if any.val.Len() == 0 {
  649. return 0
  650. }
  651. return 1
  652. }
  653. func (any *mapAny) ToFloat64() float64 {
  654. if any.val.Len() == 0 {
  655. return 0
  656. }
  657. return 1
  658. }
  659. func (any *mapAny) ToString() string {
  660. if len(any.cache) == 0 {
  661. str, err := MarshalToString(any.val.Interface())
  662. any.err = err
  663. return str
  664. } else {
  665. any.fillCache()
  666. str, err := MarshalToString(any.cache)
  667. any.err = err
  668. return str
  669. }
  670. }
  671. func (any *mapAny) Get(path ...interface{}) Any {
  672. if len(path) == 0 {
  673. return any
  674. }
  675. var element Any
  676. switch firstPath := path[0].(type) {
  677. case string:
  678. element = any.fillCacheUntil(firstPath)
  679. if element == nil {
  680. element = &invalidAny{baseAny{}, fmt.Errorf("%v not found in %v", firstPath, any.cache)}
  681. }
  682. case int32:
  683. if '*' == firstPath {
  684. any.fillCache()
  685. mappedAll := map[string]Any{}
  686. for key, value := range any.cache {
  687. mapped := value.Get(path[1:]...)
  688. if mapped.ValueType() != Invalid {
  689. mappedAll[key] = mapped
  690. }
  691. }
  692. return wrapMap(mappedAll)
  693. } else {
  694. element = &invalidAny{baseAny{}, fmt.Errorf("%v not found in %v", firstPath, any.cache)}
  695. }
  696. default:
  697. element = &invalidAny{baseAny{}, fmt.Errorf("%v not found in %v", firstPath, any.cache)}
  698. }
  699. if len(path) == 1 {
  700. return element
  701. } else {
  702. return element.Get(path[1:]...)
  703. }
  704. }
  705. func (any *mapAny) Keys() []string {
  706. any.fillCache()
  707. keys := make([]string, 0, len(any.cache))
  708. for key := range any.cache {
  709. keys = append(keys, key)
  710. }
  711. return keys
  712. }
  713. func (any *mapAny) Size() int {
  714. any.fillCache()
  715. return len(any.cache)
  716. }
  717. func (any *mapAny) IterateObject() (func() (string, Any, bool), bool) {
  718. any.fillCache()
  719. if len(any.cache) == 0 {
  720. return nil, false
  721. }
  722. keys := make([]string, len(any.cache))
  723. values := make([]Any, len(any.cache))
  724. i := 0
  725. for k, v := range any.cache {
  726. keys[i] = k
  727. values[i] = v
  728. i++
  729. }
  730. i = 0
  731. return func() (string, Any, bool) {
  732. if i == len(keys) {
  733. return "", nil, false
  734. }
  735. k := keys[i]
  736. v := values[i]
  737. i++
  738. return k, v, i != len(keys)
  739. }, true
  740. }
  741. func (any *mapAny) GetObject() map[string]Any {
  742. any.fillCache()
  743. return any.cache
  744. }
  745. func (any *mapAny) SetObject(val map[string]Any) bool {
  746. any.fillCache()
  747. any.cache = val
  748. return true
  749. }
  750. func (any *mapAny) WriteTo(stream *Stream) {
  751. if len(any.cache) == 0 {
  752. // nothing has been parsed yet
  753. stream.WriteVal(any.val)
  754. } else {
  755. any.fillCache()
  756. stream.WriteVal(any.cache)
  757. }
  758. }
  759. func (any *mapAny) GetInterface() interface{} {
  760. any.fillCache()
  761. return any.cache
  762. }