feature_any.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. package jsoniter
  2. type Any interface {
  3. LastError() error
  4. ToBool() bool
  5. ToInt() int
  6. ToInt32() int32
  7. ToInt64() int64
  8. ToFloat32() float32
  9. ToFloat64() float64
  10. ToString() string
  11. Get(path ...interface{}) Any
  12. Size() int
  13. Keys() []string
  14. IterateObject() (func() (string, Any, bool), bool)
  15. IterateArray() (func() (Any, bool), bool)
  16. }
  17. type baseAny struct {}
  18. func (any *baseAny) Get(path ...interface{}) Any {
  19. return &invalidAny{}
  20. }
  21. func (any *baseAny) Size() int {
  22. return 0
  23. }
  24. func (any *baseAny) Keys() []string {
  25. return []string{}
  26. }
  27. func (any *baseAny) IterateObject() (func() (string, Any, bool), bool) {
  28. return nil, false
  29. }
  30. func (any *baseAny) IterateArray() (func() (Any, bool), bool) {
  31. return nil, false
  32. }
  33. func (iter *Iterator) ReadAny() Any {
  34. return iter.readAny(nil)
  35. }
  36. func (iter *Iterator) readAny(reusableIter *Iterator) Any {
  37. c := iter.nextToken()
  38. switch c {
  39. case '"':
  40. return iter.readStringAny(reusableIter)
  41. case 'n':
  42. iter.skipFixedBytes(3) // null
  43. return &nilAny{}
  44. case 't':
  45. iter.skipFixedBytes(3) // true
  46. return &trueAny{}
  47. case 'f':
  48. iter.skipFixedBytes(4) // false
  49. return &falseAny{}
  50. case '{':
  51. return iter.readObjectAny(reusableIter)
  52. case '[':
  53. return iter.readArrayAny(reusableIter)
  54. default:
  55. iter.unreadByte()
  56. return iter.readNumberAny(reusableIter)
  57. }
  58. }
  59. func (iter *Iterator) readNumberAny(reusableIter *Iterator) Any {
  60. dotFound := false
  61. var lazyBuf []byte
  62. for {
  63. for i := iter.head; i < iter.tail; i++ {
  64. c := iter.buf[i]
  65. if c == '.' {
  66. dotFound = true
  67. continue
  68. }
  69. switch c {
  70. case ' ', '\n', '\r', '\t', ',', '}', ']':
  71. lazyBuf = append(lazyBuf, iter.buf[iter.head:i]...)
  72. iter.head = i
  73. if dotFound {
  74. return &floatLazyAny{baseAny{},lazyBuf, reusableIter, nil, 0}
  75. } else {
  76. return &intLazyAny{baseAny{}, lazyBuf, reusableIter, nil, 0}
  77. }
  78. }
  79. }
  80. lazyBuf = append(lazyBuf, iter.buf[iter.head:iter.tail]...)
  81. if !iter.loadMore() {
  82. iter.head = iter.tail
  83. if dotFound {
  84. return &floatLazyAny{baseAny{}, lazyBuf, reusableIter, nil, 0}
  85. } else {
  86. return &intLazyAny{baseAny{}, lazyBuf, reusableIter, nil, 0}
  87. }
  88. }
  89. }
  90. }
  91. func (iter *Iterator) readStringAny(reusableIter *Iterator) Any {
  92. lazyBuf := make([]byte, 1, 8)
  93. lazyBuf[0] = '"'
  94. for {
  95. end, escaped := iter.findStringEnd()
  96. if end == -1 {
  97. lazyBuf = append(lazyBuf, iter.buf[iter.head:iter.tail]...)
  98. if !iter.loadMore() {
  99. iter.reportError("readStringAny", "incomplete string")
  100. return &invalidAny{}
  101. }
  102. if escaped {
  103. iter.head = 1 // skip the first char as last char read is \
  104. }
  105. } else {
  106. lazyBuf = append(lazyBuf, iter.buf[iter.head:end]...)
  107. iter.head = end
  108. return &stringLazyAny{baseAny{}, lazyBuf, reusableIter, nil, ""}
  109. }
  110. }
  111. }
  112. func (iter *Iterator) readObjectAny(reusableIter *Iterator) Any {
  113. level := 1
  114. lazyBuf := make([]byte, 1, 32)
  115. lazyBuf[0] = '{'
  116. for {
  117. start := iter.head
  118. for i := iter.head; i < iter.tail; i++ {
  119. switch iter.buf[i] {
  120. case '"': // If inside string, skip it
  121. iter.head = i + 1
  122. iter.skipString()
  123. i = iter.head - 1 // it will be i++ soon
  124. case '{': // If open symbol, increase level
  125. level++
  126. case '}': // If close symbol, increase level
  127. level--
  128. // If we have returned to the original level, we're done
  129. if level == 0 {
  130. iter.head = i + 1
  131. lazyBuf = append(lazyBuf, iter.buf[start:iter.head]...)
  132. return &objectLazyAny{baseAny{}, lazyBuf, reusableIter, nil, nil, lazyBuf}
  133. }
  134. }
  135. }
  136. lazyBuf = append(lazyBuf, iter.buf[iter.head:iter.tail]...)
  137. if !iter.loadMore() {
  138. iter.reportError("skipObject", "incomplete object")
  139. return &invalidAny{}
  140. }
  141. }
  142. }
  143. func (iter *Iterator) readArrayAny(reusableIter *Iterator) Any {
  144. level := 1
  145. lazyBuf := make([]byte, 1, 32)
  146. lazyBuf[0] = '{'
  147. for {
  148. start := iter.head
  149. for i := iter.head; i < iter.tail; i++ {
  150. switch iter.buf[i] {
  151. case '"': // If inside string, skip it
  152. iter.head = i + 1
  153. iter.skipString()
  154. i = iter.head - 1 // it will be i++ soon
  155. case '[': // If open symbol, increase level
  156. level++
  157. case ']': // If close symbol, increase level
  158. level--
  159. // If we have returned to the original level, we're done
  160. if level == 0 {
  161. iter.head = i + 1
  162. lazyBuf = append(lazyBuf, iter.buf[start:iter.head]...)
  163. return &arrayLazyAny{baseAny{},lazyBuf, reusableIter, nil, nil, lazyBuf}
  164. }
  165. }
  166. }
  167. lazyBuf = append(lazyBuf, iter.buf[iter.head:iter.tail]...)
  168. if !iter.loadMore() {
  169. iter.reportError("skipArray", "incomplete array")
  170. return &invalidAny{}
  171. }
  172. }
  173. }