jsoniter_reflect.go 933 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package jsoniter
  2. import (
  3. "reflect"
  4. "errors"
  5. )
  6. type Decoder interface {
  7. decode(iter *Iterator, obj interface{})
  8. }
  9. type stringDecoder struct {
  10. }
  11. func (decoder *stringDecoder) decode(iter *Iterator, obj interface{}) {
  12. ptr := obj.(*string)
  13. *ptr = iter.ReadString()
  14. }
  15. var DECODER_STRING *stringDecoder
  16. func init() {
  17. DECODER_STRING = &stringDecoder{}
  18. }
  19. func (iter *Iterator) Read(obj interface{}) {
  20. type_ := reflect.TypeOf(obj)
  21. decoder, err := decoderOfType(type_)
  22. if err != nil {
  23. iter.Error = err
  24. return
  25. }
  26. decoder.decode(iter, obj)
  27. }
  28. func decoderOfType(type_ reflect.Type) (Decoder, error) {
  29. switch type_.Kind() {
  30. case reflect.Ptr:
  31. return decoderOfPtr(type_.Elem())
  32. default:
  33. return nil, errors.New("expect ptr")
  34. }
  35. }
  36. func decoderOfPtr(type_ reflect.Type) (Decoder, error) {
  37. switch type_.Kind() {
  38. case reflect.String:
  39. return DECODER_STRING, nil
  40. default:
  41. return nil, errors.New("expect string")
  42. }
  43. }