feature_iter_object.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package jsoniter
  2. // ReadObject is a implemented iterator for json
  3. func (iter *Iterator) ReadObject() (ret string) {
  4. c := iter.nextToken()
  5. if iter.Error != nil {
  6. return
  7. }
  8. switch c {
  9. case 'n':
  10. iter.skipFixedBytes(3)
  11. if iter.Error != nil {
  12. return
  13. }
  14. return "" // null
  15. case '{':
  16. c = iter.nextToken()
  17. if iter.Error != nil {
  18. return
  19. }
  20. switch c {
  21. case '}':
  22. return "" // end of object
  23. case '"':
  24. iter.unreadByte()
  25. return string(iter.readObjectFieldAsBytes())
  26. default:
  27. iter.reportError("ReadObject", `expect " after {`)
  28. return
  29. }
  30. case ',':
  31. return string(iter.readObjectFieldAsBytes())
  32. case '}':
  33. return "" // end of object
  34. default:
  35. iter.reportError("ReadObject", `expect { or , or } or n`)
  36. return
  37. }
  38. }
  39. func (iter *Iterator) readObjectStart() bool {
  40. c := iter.nextToken()
  41. if c == '{' {
  42. c = iter.nextToken()
  43. if c == '}' {
  44. return false
  45. }
  46. iter.unreadByte()
  47. return true
  48. }
  49. iter.reportError("readObjectStart", "expect { ")
  50. return false
  51. }
  52. func (iter *Iterator) readObjectFieldAsBytes() (ret []byte) {
  53. str := iter.ReadStringAsSlice()
  54. if iter.skipWhitespacesWithoutLoadMore() {
  55. if ret == nil {
  56. ret = make([]byte, len(str))
  57. copy(ret, str)
  58. }
  59. if !iter.loadMore() {
  60. return
  61. }
  62. }
  63. if iter.buf[iter.head] != ':' {
  64. iter.reportError("readObjectFieldAsBytes", "expect : after object field")
  65. return
  66. }
  67. iter.head++
  68. if iter.skipWhitespacesWithoutLoadMore() {
  69. if ret == nil {
  70. ret = make([]byte, len(str))
  71. copy(ret, str)
  72. }
  73. if !iter.loadMore() {
  74. return
  75. }
  76. }
  77. if ret == nil {
  78. return str
  79. }
  80. return ret
  81. }