feature_iter_object.go 1.5 KB

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