feature_iter_object.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package jsoniter
  2. import "unsafe"
  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.skipUntilBreak()
  11. if iter.Error != nil {
  12. return
  13. }
  14. return "" // null
  15. }
  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. }
  32. case ',':
  33. return iter.readObjectField()
  34. case '}':
  35. return "" // end of object
  36. default:
  37. iter.ReportError("ReadObject", `expect { or , or } or n`)
  38. return
  39. }
  40. }
  41. func (iter *Iterator) readObjectStart() bool {
  42. c := iter.nextToken()
  43. if c == '{' {
  44. c = iter.nextToken()
  45. if c == '}' {
  46. return false
  47. }
  48. iter.unreadByte()
  49. return true
  50. }
  51. iter.ReportError("readObjectStart", "expect { ")
  52. return false
  53. }
  54. func (iter *Iterator) readObjectField() (ret string) {
  55. str := iter.readStringAsBytes()
  56. if iter.skipWhitespacesWithoutLoadMore() {
  57. if ret == "" {
  58. ret = string(str);
  59. }
  60. if !iter.loadMore() {
  61. return
  62. }
  63. }
  64. if iter.buf[iter.head] != ':' {
  65. iter.ReportError("ReadObject", "expect : after object field")
  66. return
  67. }
  68. iter.head++
  69. if iter.skipWhitespacesWithoutLoadMore() {
  70. if ret == "" {
  71. ret = string(str);
  72. }
  73. if !iter.loadMore() {
  74. return
  75. }
  76. }
  77. if ret == "" {
  78. return *(*string)(unsafe.Pointer(&str))
  79. }
  80. return ret
  81. }