jsoniter.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893
  1. package jsoniter
  2. import (
  3. "io"
  4. "fmt"
  5. "unicode/utf16"
  6. "strconv"
  7. "unsafe"
  8. "encoding/base64"
  9. )
  10. type ValueType int
  11. const (
  12. Invalid ValueType = iota
  13. String
  14. Number
  15. Null
  16. Bool
  17. Array
  18. Object
  19. )
  20. var digits []byte
  21. var valueTypes []ValueType
  22. func init() {
  23. digits = make([]byte, 256)
  24. for i := 0; i < len(digits); i++ {
  25. digits[i] = 255
  26. }
  27. for i := '0'; i <= '9'; i++ {
  28. digits[i] = byte(i - '0');
  29. }
  30. for i := 'a'; i <= 'f'; i++ {
  31. digits[i] = byte((i - 'a') + 10);
  32. }
  33. for i := 'A'; i <= 'F'; i++ {
  34. digits[i] = byte((i - 'A') + 10);
  35. }
  36. valueTypes = make([]ValueType, 256)
  37. for i := 0; i < len(valueTypes); i++ {
  38. valueTypes[i] = Invalid
  39. }
  40. valueTypes['"'] = String;
  41. valueTypes['-'] = Number;
  42. valueTypes['0'] = Number;
  43. valueTypes['1'] = Number;
  44. valueTypes['2'] = Number;
  45. valueTypes['3'] = Number;
  46. valueTypes['4'] = Number;
  47. valueTypes['5'] = Number;
  48. valueTypes['6'] = Number;
  49. valueTypes['7'] = Number;
  50. valueTypes['8'] = Number;
  51. valueTypes['9'] = Number;
  52. valueTypes['t'] = Bool;
  53. valueTypes['f'] = Bool;
  54. valueTypes['n'] = Null;
  55. valueTypes['['] = Array;
  56. valueTypes['{'] = Object;
  57. }
  58. type Iterator struct {
  59. reader io.Reader
  60. buf []byte
  61. head int
  62. tail int
  63. Error error
  64. }
  65. func Parse(reader io.Reader, bufSize int) *Iterator {
  66. iter := &Iterator{
  67. reader: reader,
  68. buf: make([]byte, bufSize),
  69. head: 0,
  70. tail: 0,
  71. }
  72. return iter
  73. }
  74. func ParseBytes(input []byte) *Iterator {
  75. iter := &Iterator{
  76. reader: nil,
  77. buf: input,
  78. head: 0,
  79. tail: len(input),
  80. }
  81. return iter
  82. }
  83. func ParseString(input string) *Iterator {
  84. return ParseBytes([]byte(input))
  85. }
  86. func (iter *Iterator) Reset(reader io.Reader) *Iterator {
  87. iter.reader = reader
  88. iter.head = 0
  89. iter.tail = 0
  90. return iter
  91. }
  92. func (iter *Iterator) ResetBytes(input []byte) *Iterator {
  93. // only for benchmarking
  94. iter.reader = nil
  95. iter.Error = nil
  96. iter.buf = input
  97. iter.head = 0
  98. iter.tail = len(input)
  99. return iter
  100. }
  101. func (iter *Iterator) WhatIsNext() ValueType {
  102. valueType := valueTypes[iter.readByte()];
  103. iter.unreadByte();
  104. return valueType;
  105. }
  106. func (iter *Iterator) skipWhitespacesWithoutLoadMore() bool {
  107. for i := iter.head; i < iter.tail; i++ {
  108. c := iter.buf[i]
  109. switch c {
  110. case ' ', '\n', '\t', '\r':
  111. continue
  112. }
  113. iter.head = i
  114. return false
  115. }
  116. return true
  117. }
  118. func (iter *Iterator) nextToken() byte {
  119. // a variation of skip whitespaces, returning the next non-whitespace token
  120. for {
  121. for i := iter.head; i < iter.tail; i++ {
  122. c := iter.buf[i]
  123. switch c {
  124. case ' ', '\n', '\t', '\r':
  125. continue
  126. }
  127. iter.head = i+1
  128. return c
  129. }
  130. if !iter.loadMore() {
  131. return 0
  132. }
  133. }
  134. }
  135. func (iter *Iterator) ReportError(operation string, msg string) {
  136. if iter.Error != nil {
  137. return
  138. }
  139. peekStart := iter.head - 10
  140. if peekStart < 0 {
  141. peekStart = 0
  142. }
  143. iter.Error = fmt.Errorf("%s: %s, parsing %v ...%s... at %s", operation, msg, iter.head,
  144. string(iter.buf[peekStart: iter.head]), string(iter.buf[0:iter.tail]))
  145. }
  146. func (iter *Iterator) CurrentBuffer() string {
  147. peekStart := iter.head - 10
  148. if peekStart < 0 {
  149. peekStart = 0
  150. }
  151. return fmt.Sprintf("parsing %v ...|%s|... at %s", iter.head,
  152. string(iter.buf[peekStart: iter.head]), string(iter.buf[0:iter.tail]))
  153. }
  154. func (iter *Iterator) readByte() (ret byte) {
  155. if iter.head == iter.tail {
  156. if iter.loadMore() {
  157. ret = iter.buf[iter.head]
  158. iter.head++
  159. return ret
  160. } else {
  161. return 0
  162. }
  163. }
  164. ret = iter.buf[iter.head]
  165. iter.head++
  166. return ret
  167. }
  168. func (iter *Iterator) loadMore() bool {
  169. if iter.reader == nil {
  170. iter.Error = io.EOF
  171. return false
  172. }
  173. for {
  174. n, err := iter.reader.Read(iter.buf)
  175. if n == 0 {
  176. if err != nil {
  177. iter.Error = err
  178. return false
  179. } else {
  180. // n == 0, err == nil is not EOF
  181. continue
  182. }
  183. } else {
  184. iter.head = 0
  185. iter.tail = n
  186. return true
  187. }
  188. }
  189. }
  190. func (iter *Iterator) unreadByte() {
  191. if iter.head == 0 {
  192. iter.ReportError("unreadByte", "unread too many bytes")
  193. return
  194. }
  195. iter.head -= 1
  196. return
  197. }
  198. const maxUint64 = (1 << 64 - 1)
  199. const cutoffUint64 = maxUint64 / 10 + 1
  200. const maxUint32 = (1 << 32 - 1)
  201. const cutoffUint32 = maxUint32 / 10 + 1
  202. func (iter *Iterator) ReadUint() (ret uint) {
  203. val := iter.ReadUint64()
  204. converted := uint(val)
  205. if uint64(converted) != val {
  206. iter.ReportError("ReadUint", "int overflow")
  207. return
  208. }
  209. return converted
  210. }
  211. func (iter *Iterator) ReadUint8() (ret uint8) {
  212. val := iter.ReadUint64()
  213. converted := uint8(val)
  214. if uint64(converted) != val {
  215. iter.ReportError("ReadUint8", "int overflow")
  216. return
  217. }
  218. return converted
  219. }
  220. func (iter *Iterator) ReadUint16() (ret uint16) {
  221. val := iter.ReadUint64()
  222. converted := uint16(val)
  223. if uint64(converted) != val {
  224. iter.ReportError("ReadUint16", "int overflow")
  225. return
  226. }
  227. return converted
  228. }
  229. func (iter *Iterator) ReadUint32() (ret uint32) {
  230. val := iter.ReadUint64()
  231. converted := uint32(val)
  232. if uint64(converted) != val {
  233. iter.ReportError("ReadUint32", "int overflow")
  234. return
  235. }
  236. return converted
  237. }
  238. func (iter *Iterator) ReadUint64() (ret uint64) {
  239. c := iter.readByte()
  240. v := digits[c]
  241. if v == 0 {
  242. return 0 // single zero
  243. }
  244. if v == 255 {
  245. iter.ReportError("ReadUint64", "unexpected character")
  246. return
  247. }
  248. for {
  249. if ret >= cutoffUint64 {
  250. iter.ReportError("ReadUint64", "overflow")
  251. return
  252. }
  253. ret = ret * 10 + uint64(v)
  254. c = iter.readByte()
  255. v = digits[c]
  256. if v == 255 {
  257. iter.unreadByte()
  258. break
  259. }
  260. }
  261. return ret
  262. }
  263. func (iter *Iterator) ReadInt() (ret int) {
  264. val := iter.ReadInt64()
  265. converted := int(val)
  266. if int64(converted) != val {
  267. iter.ReportError("ReadInt", "int overflow")
  268. return
  269. }
  270. return converted
  271. }
  272. func (iter *Iterator) ReadInt8() (ret int8) {
  273. val := iter.ReadInt64()
  274. converted := int8(val)
  275. if int64(converted) != val {
  276. iter.ReportError("ReadInt8", "int overflow")
  277. return
  278. }
  279. return converted
  280. }
  281. func (iter *Iterator) ReadInt16() (ret int16) {
  282. val := iter.ReadInt64()
  283. converted := int16(val)
  284. if int64(converted) != val {
  285. iter.ReportError("ReadInt16", "int overflow")
  286. return
  287. }
  288. return converted
  289. }
  290. func (iter *Iterator) ReadInt32() (ret int32) {
  291. val := iter.ReadInt64()
  292. converted := int32(val)
  293. if int64(converted) != val {
  294. iter.ReportError("ReadInt32", "int overflow")
  295. return
  296. }
  297. return converted
  298. }
  299. func (iter *Iterator) ReadInt64() (ret int64) {
  300. c := iter.readByte()
  301. if iter.Error != nil {
  302. return
  303. }
  304. /* optional leading minus */
  305. if c == '-' {
  306. n := iter.ReadUint64()
  307. return -int64(n)
  308. } else {
  309. iter.unreadByte()
  310. n := iter.ReadUint64()
  311. return int64(n)
  312. }
  313. }
  314. func (iter *Iterator) ReadString() (ret string) {
  315. return string(iter.readStringAsBytes())
  316. }
  317. func (iter *Iterator) readStringAsBytes() (ret []byte) {
  318. c := iter.nextToken()
  319. if c == 'n' {
  320. iter.skipUntilBreak()
  321. return
  322. }
  323. if c != '"' {
  324. iter.ReportError("ReadString", `expects " or n`)
  325. return
  326. }
  327. end := iter.findStringEndWithoutEscape()
  328. if end != -1 {
  329. // fast path: reuse the underlying buffer
  330. ret = iter.buf[iter.head:end-1]
  331. iter.head = end
  332. return ret
  333. }
  334. str := make([]byte, 0, 8)
  335. for iter.Error == nil {
  336. c = iter.readByte()
  337. if c == '"' {
  338. return str
  339. }
  340. if c == '\\' {
  341. c = iter.readByte()
  342. if iter.Error != nil {
  343. return
  344. }
  345. switch c {
  346. case 'u':
  347. r := iter.readU4()
  348. if iter.Error != nil {
  349. return
  350. }
  351. if utf16.IsSurrogate(r) {
  352. c = iter.readByte()
  353. if iter.Error != nil {
  354. return
  355. }
  356. if c != '\\' {
  357. iter.ReportError("ReadString",
  358. `expects \u after utf16 surrogate, but \ not found`)
  359. return
  360. }
  361. c = iter.readByte()
  362. if iter.Error != nil {
  363. return
  364. }
  365. if c != 'u' {
  366. iter.ReportError("ReadString",
  367. `expects \u after utf16 surrogate, but \u not found`)
  368. return
  369. }
  370. r2 := iter.readU4()
  371. if iter.Error != nil {
  372. return
  373. }
  374. combined := utf16.DecodeRune(r, r2)
  375. str = appendRune(str, combined)
  376. } else {
  377. str = appendRune(str, r)
  378. }
  379. case '"':
  380. str = append(str, '"')
  381. case '\\':
  382. str = append(str, '\\')
  383. case '/':
  384. str = append(str, '/')
  385. case 'b':
  386. str = append(str, '\b')
  387. case 'f':
  388. str = append(str, '\f')
  389. case 'n':
  390. str = append(str, '\n')
  391. case 'r':
  392. str = append(str, '\r')
  393. case 't':
  394. str = append(str, '\t')
  395. default:
  396. iter.ReportError("ReadString",
  397. `invalid escape char after \`)
  398. return
  399. }
  400. } else {
  401. str = append(str, c)
  402. }
  403. }
  404. return
  405. }
  406. func (iter *Iterator) readU4() (ret rune) {
  407. for i := 0; i < 4; i++ {
  408. c := iter.readByte()
  409. if iter.Error != nil {
  410. return
  411. }
  412. if (c >= '0' && c <= '9') {
  413. if ret >= cutoffUint32 {
  414. iter.ReportError("readU4", "overflow")
  415. return
  416. }
  417. ret = ret * 16 + rune(c - '0')
  418. } else if ((c >= 'a' && c <= 'f') ) {
  419. if ret >= cutoffUint32 {
  420. iter.ReportError("readU4", "overflow")
  421. return
  422. }
  423. ret = ret * 16 + rune(c - 'a' + 10)
  424. } else {
  425. iter.ReportError("readU4", "expects 0~9 or a~f")
  426. return
  427. }
  428. }
  429. return ret
  430. }
  431. const (
  432. t1 = 0x00 // 0000 0000
  433. tx = 0x80 // 1000 0000
  434. t2 = 0xC0 // 1100 0000
  435. t3 = 0xE0 // 1110 0000
  436. t4 = 0xF0 // 1111 0000
  437. t5 = 0xF8 // 1111 1000
  438. maskx = 0x3F // 0011 1111
  439. mask2 = 0x1F // 0001 1111
  440. mask3 = 0x0F // 0000 1111
  441. mask4 = 0x07 // 0000 0111
  442. rune1Max = 1 << 7 - 1
  443. rune2Max = 1 << 11 - 1
  444. rune3Max = 1 << 16 - 1
  445. surrogateMin = 0xD800
  446. surrogateMax = 0xDFFF
  447. MaxRune = '\U0010FFFF' // Maximum valid Unicode code point.
  448. RuneError = '\uFFFD' // the "error" Rune or "Unicode replacement character"
  449. )
  450. func appendRune(p []byte, r rune) []byte {
  451. // Negative values are erroneous. Making it unsigned addresses the problem.
  452. switch i := uint32(r); {
  453. case i <= rune1Max:
  454. p = append(p, byte(r))
  455. return p
  456. case i <= rune2Max:
  457. p = append(p, t2 | byte(r >> 6))
  458. p = append(p, tx | byte(r) & maskx)
  459. return p
  460. case i > MaxRune, surrogateMin <= i && i <= surrogateMax:
  461. r = RuneError
  462. fallthrough
  463. case i <= rune3Max:
  464. p = append(p, t3 | byte(r >> 12))
  465. p = append(p, tx | byte(r >> 6) & maskx)
  466. p = append(p, tx | byte(r) & maskx)
  467. return p
  468. default:
  469. p = append(p, t4 | byte(r >> 18))
  470. p = append(p, tx | byte(r >> 12) & maskx)
  471. p = append(p, tx | byte(r >> 6) & maskx)
  472. p = append(p, tx | byte(r) & maskx)
  473. return p
  474. }
  475. }
  476. func (iter *Iterator) ReadArray() (ret bool) {
  477. c := iter.nextToken()
  478. if iter.Error != nil {
  479. return
  480. }
  481. switch c {
  482. case 'n': {
  483. iter.skipUntilBreak()
  484. return false // null
  485. }
  486. case '[': {
  487. c = iter.nextToken()
  488. if iter.Error != nil {
  489. return
  490. }
  491. if c == ']' {
  492. return false
  493. } else {
  494. iter.unreadByte()
  495. return true
  496. }
  497. }
  498. case ']': return false
  499. case ',':
  500. return true
  501. default:
  502. iter.ReportError("ReadArray", "expect [ or , or ] or n")
  503. return
  504. }
  505. }
  506. func (iter *Iterator) ReadObject() (ret string) {
  507. c := iter.nextToken()
  508. if iter.Error != nil {
  509. return
  510. }
  511. switch c {
  512. case 'n': {
  513. iter.skipUntilBreak()
  514. if iter.Error != nil {
  515. return
  516. }
  517. return "" // null
  518. }
  519. case '{': {
  520. c = iter.nextToken()
  521. if iter.Error != nil {
  522. return
  523. }
  524. switch c {
  525. case '}':
  526. return "" // end of object
  527. case '"':
  528. iter.unreadByte()
  529. return iter.readObjectField()
  530. default:
  531. iter.ReportError("ReadObject", `expect " after {`)
  532. return
  533. }
  534. }
  535. case ',':
  536. return iter.readObjectField()
  537. case '}':
  538. return "" // end of object
  539. default:
  540. iter.ReportError("ReadObject", `expect { or , or } or n`)
  541. return
  542. }
  543. }
  544. func (iter *Iterator) readObjectField() (ret string) {
  545. str := iter.readStringAsBytes()
  546. if iter.skipWhitespacesWithoutLoadMore() {
  547. if ret == "" {
  548. ret = string(str);
  549. }
  550. if !iter.loadMore() {
  551. return
  552. }
  553. }
  554. if iter.buf[iter.head] != ':' {
  555. iter.ReportError("ReadObject", "expect : after object field")
  556. return
  557. }
  558. iter.head++
  559. if iter.skipWhitespacesWithoutLoadMore() {
  560. if ret == "" {
  561. ret = string(str);
  562. }
  563. if !iter.loadMore() {
  564. return
  565. }
  566. }
  567. if ret == "" {
  568. return *(*string)(unsafe.Pointer(&str))
  569. }
  570. return ret
  571. }
  572. func (iter *Iterator) ReadFloat32() (ret float32) {
  573. strBuf := [8]byte{}
  574. str := strBuf[0:0]
  575. hasMore := true
  576. for(hasMore) {
  577. for i := iter.head; i < iter.tail; i++ {
  578. c := iter.buf[i]
  579. switch c {
  580. case '-', '+', '.', 'e', 'E', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
  581. str = append(str, c)
  582. continue
  583. default:
  584. hasMore = false
  585. break
  586. }
  587. }
  588. if hasMore {
  589. if !iter.loadMore() {
  590. break
  591. }
  592. }
  593. }
  594. if iter.Error != nil && iter.Error != io.EOF {
  595. return
  596. }
  597. val, err := strconv.ParseFloat(*(*string)(unsafe.Pointer(&str)), 32)
  598. if err != nil {
  599. iter.Error = err
  600. return
  601. }
  602. return float32(val)
  603. }
  604. func (iter *Iterator) ReadFloat64() (ret float64) {
  605. strBuf := [8]byte{}
  606. str := strBuf[0:0]
  607. hasMore := true
  608. for(hasMore) {
  609. for i := iter.head; i < iter.tail; i++ {
  610. c := iter.buf[i]
  611. switch c {
  612. case '-', '+', '.', 'e', 'E', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
  613. str = append(str, c)
  614. continue
  615. default:
  616. hasMore = false
  617. break
  618. }
  619. }
  620. if hasMore {
  621. if !iter.loadMore() {
  622. break
  623. }
  624. }
  625. }
  626. if iter.Error != nil && iter.Error != io.EOF {
  627. return
  628. }
  629. val, err := strconv.ParseFloat(*(*string)(unsafe.Pointer(&str)), 64)
  630. if err != nil {
  631. iter.Error = err
  632. return
  633. }
  634. return val
  635. }
  636. func (iter *Iterator) ReadBool() (ret bool) {
  637. c := iter.readByte()
  638. if iter.Error != nil {
  639. return
  640. }
  641. switch c {
  642. case 't':
  643. iter.skipUntilBreak()
  644. return true
  645. case 'f':
  646. iter.skipUntilBreak()
  647. return false
  648. default:
  649. iter.ReportError("ReadBool", "expect t or f")
  650. return
  651. }
  652. }
  653. func (iter *Iterator) ReadBase64() (ret []byte) {
  654. src := iter.readStringAsBytes()
  655. if iter.Error != nil {
  656. return
  657. }
  658. b64 := base64.StdEncoding
  659. ret = make([]byte, b64.DecodedLen(len(src)))
  660. n, err := b64.Decode(ret, src)
  661. if err != nil {
  662. iter.Error = err
  663. return
  664. }
  665. return ret[:n]
  666. }
  667. func (iter *Iterator) ReadNull() (ret bool) {
  668. c := iter.readByte()
  669. if c == 'n' {
  670. iter.skipUntilBreak()
  671. return true
  672. }
  673. iter.unreadByte()
  674. return false
  675. }
  676. func (iter *Iterator) Skip() {
  677. c := iter.readByte()
  678. switch c {
  679. case '"':
  680. iter.skipString()
  681. case '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 't', 'f', 'n':
  682. iter.skipUntilBreak()
  683. case '[':
  684. iter.skipArray()
  685. case '{':
  686. iter.skipObject()
  687. default:
  688. iter.ReportError("Skip", fmt.Sprintf("do not know how to skip: %v", c))
  689. return
  690. }
  691. }
  692. func (iter *Iterator) skipString() {
  693. for {
  694. end, escaped := iter.findStringEnd()
  695. if end == -1 {
  696. if !iter.loadMore() {
  697. return
  698. }
  699. if escaped {
  700. iter.head = 1 // skip the first char as last char read is \
  701. }
  702. } else {
  703. iter.head = end
  704. return
  705. }
  706. }
  707. }
  708. // adapted from: https://github.com/buger/jsonparser/blob/master/parser.go
  709. // Tries to find the end of string
  710. // Support if string contains escaped quote symbols.
  711. func (iter *Iterator) findStringEnd() (int, bool) {
  712. escaped := false
  713. for i := iter.head; i < iter.tail; i++ {
  714. c := iter.buf[i]
  715. if c == '"' {
  716. if !escaped {
  717. return i + 1, false
  718. } else {
  719. j := i - 1
  720. for {
  721. if j < iter.head || iter.buf[j] != '\\' {
  722. // even number of backslashes
  723. // either end of buffer, or " found
  724. return i + 1, true
  725. }
  726. j--
  727. if j < iter.head || iter.buf[j] != '\\' {
  728. // odd number of backslashes
  729. // it is \" or \\\"
  730. break
  731. }
  732. j--
  733. }
  734. }
  735. } else if c == '\\' {
  736. escaped = true
  737. }
  738. }
  739. j := iter.tail - 1
  740. for {
  741. if j < iter.head || iter.buf[j] != '\\' {
  742. // even number of backslashes
  743. // either end of buffer, or " found
  744. return -1, false // do not end with \
  745. }
  746. j--
  747. if j < iter.head || iter.buf[j] != '\\' {
  748. // odd number of backslashes
  749. // it is \" or \\\"
  750. break
  751. }
  752. j--
  753. }
  754. return -1, true // end with \
  755. }
  756. func (iter *Iterator) findStringEndWithoutEscape() int {
  757. for i := iter.head; i < iter.tail; i++ {
  758. c := iter.buf[i]
  759. if c == '"' {
  760. return i + 1
  761. } else if c == '\\' {
  762. return -1
  763. }
  764. }
  765. return -1
  766. }
  767. func (iter *Iterator) skipArray() {
  768. level := 1
  769. for {
  770. for i := iter.head; i < iter.tail; i++ {
  771. switch iter.buf[i] {
  772. case '"': // If inside string, skip it
  773. iter.head = i + 1
  774. iter.skipString()
  775. i = iter.head - 1 // it will be i++ soon
  776. case '[': // If open symbol, increase level
  777. level++
  778. case ']': // If close symbol, increase level
  779. level--
  780. // If we have returned to the original level, we're done
  781. if level == 0 {
  782. iter.head = i + 1
  783. return
  784. }
  785. }
  786. }
  787. if (!iter.loadMore()) {
  788. return
  789. }
  790. }
  791. }
  792. func (iter *Iterator) skipObject() {
  793. level := 1
  794. for {
  795. for i := iter.head; i < iter.tail; i++ {
  796. switch iter.buf[i] {
  797. case '"': // If inside string, skip it
  798. iter.head = i + 1
  799. iter.skipString()
  800. i = iter.head - 1 // it will be i++ soon
  801. case '{': // If open symbol, increase level
  802. level++
  803. case '}': // If close symbol, increase level
  804. level--
  805. // If we have returned to the original level, we're done
  806. if level == 0 {
  807. iter.head = i + 1
  808. return
  809. }
  810. }
  811. }
  812. if (!iter.loadMore()) {
  813. return
  814. }
  815. }
  816. }
  817. func (iter *Iterator) skipUntilBreak() {
  818. // true, false, null, number
  819. for {
  820. for i := iter.head; i < iter.tail; i++ {
  821. c := iter.buf[i]
  822. switch c {
  823. case ' ', '\n', '\r', '\t', ',', '}', ']':
  824. iter.head = i
  825. return
  826. }
  827. }
  828. if (!iter.loadMore()) {
  829. return
  830. }
  831. }
  832. }