feature_any_string.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package jsoniter
  2. import (
  3. "io"
  4. )
  5. type stringLazyAny struct{
  6. buf []byte
  7. iter *Iterator
  8. err error
  9. cache string
  10. }
  11. func (any *stringLazyAny) fillCache() {
  12. if any.err != nil {
  13. return
  14. }
  15. iter := any.parse()
  16. any.cache = iter.ReadString()
  17. if iter.Error != io.EOF {
  18. iter.reportError("stringLazyAny", "there are bytes left")
  19. }
  20. any.err = iter.Error
  21. }
  22. func (any *stringLazyAny) parse() *Iterator {
  23. iter := any.iter
  24. if iter == nil {
  25. iter = NewIterator()
  26. any.iter = iter
  27. }
  28. iter.ResetBytes(any.buf)
  29. return iter
  30. }
  31. func (any *stringLazyAny) LastError() error {
  32. return any.err
  33. }
  34. func (any *stringLazyAny) ToBool() bool {
  35. str := any.ToString()
  36. if str == "false" {
  37. return false
  38. }
  39. for _, c := range str {
  40. switch c {
  41. case ' ', '\n', '\r', '\t':
  42. default:
  43. return true
  44. }
  45. }
  46. return false
  47. }
  48. func (any *stringLazyAny) ToInt() int {
  49. iter := any.parse()
  50. iter.head++
  51. val := iter.ReadInt()
  52. any.err = iter.Error
  53. return val
  54. }
  55. func (any *stringLazyAny) ToInt32() int32 {
  56. iter := any.parse()
  57. iter.head++
  58. val := iter.ReadInt32()
  59. any.err = iter.Error
  60. return val
  61. }
  62. func (any *stringLazyAny) ToInt64() int64 {
  63. iter := any.parse()
  64. iter.head++
  65. val := iter.ReadInt64()
  66. any.err = iter.Error
  67. return val
  68. }
  69. func (any *stringLazyAny) ToFloat32() float32 {
  70. iter := any.parse()
  71. iter.head++
  72. val := iter.ReadFloat32()
  73. any.err = iter.Error
  74. return val
  75. }
  76. func (any *stringLazyAny) ToFloat64() float64 {
  77. iter := any.parse()
  78. iter.head++
  79. val := iter.ReadFloat64()
  80. any.err = iter.Error
  81. return val
  82. }
  83. func (any *stringLazyAny) ToString() string {
  84. any.fillCache()
  85. return any.cache
  86. }