feature_reflect_map.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. package jsoniter
  2. import (
  3. "unsafe"
  4. "reflect"
  5. "encoding/json"
  6. "encoding"
  7. )
  8. type mapDecoder struct {
  9. mapType reflect.Type
  10. elemType reflect.Type
  11. elemDecoder Decoder
  12. mapInterface emptyInterface
  13. }
  14. func (decoder *mapDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  15. // dark magic to cast unsafe.Pointer back to interface{} using reflect.Type
  16. mapInterface := decoder.mapInterface
  17. mapInterface.word = ptr
  18. realInterface := (*interface{})(unsafe.Pointer(&mapInterface))
  19. realVal := reflect.ValueOf(*realInterface).Elem()
  20. if realVal.IsNil() {
  21. realVal.Set(reflect.MakeMap(realVal.Type()))
  22. }
  23. for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  24. elem := reflect.New(decoder.elemType)
  25. decoder.elemDecoder.decode(unsafe.Pointer(elem.Pointer()), iter)
  26. // to put into map, we have to use reflection
  27. realVal.SetMapIndex(reflect.ValueOf(string([]byte(field))), elem.Elem())
  28. }
  29. }
  30. type mapEncoder struct {
  31. mapType reflect.Type
  32. elemType reflect.Type
  33. elemEncoder Encoder
  34. mapInterface emptyInterface
  35. }
  36. func (encoder *mapEncoder) encode(ptr unsafe.Pointer, stream *Stream) {
  37. mapInterface := encoder.mapInterface
  38. mapInterface.word = ptr
  39. realInterface := (*interface{})(unsafe.Pointer(&mapInterface))
  40. realVal := reflect.ValueOf(*realInterface)
  41. stream.WriteObjectStart()
  42. for i, key := range realVal.MapKeys() {
  43. if i != 0 {
  44. stream.WriteMore()
  45. }
  46. encodeMapKey(key, stream)
  47. stream.writeByte(':')
  48. val := realVal.MapIndex(key).Interface()
  49. encoder.elemEncoder.encodeInterface(val, stream)
  50. }
  51. stream.WriteObjectEnd()
  52. }
  53. func encodeMapKey(key reflect.Value, stream *Stream) {
  54. if key.Kind() == reflect.String {
  55. stream.WriteString(key.String())
  56. return
  57. }
  58. if tm, ok := key.Interface().(encoding.TextMarshaler); ok {
  59. buf, err := tm.MarshalText()
  60. if err != nil {
  61. stream.Error = err
  62. return
  63. }
  64. stream.writeByte('"')
  65. stream.Write(buf)
  66. stream.writeByte('"')
  67. return
  68. }
  69. switch key.Kind() {
  70. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  71. stream.writeByte('"')
  72. stream.WriteInt64(key.Int())
  73. stream.writeByte('"')
  74. return
  75. case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
  76. stream.writeByte('"')
  77. stream.WriteUint64(key.Uint())
  78. stream.writeByte('"')
  79. return
  80. }
  81. stream.Error = &json.UnsupportedTypeError{key.Type()}
  82. }
  83. func (encoder *mapEncoder) encodeInterface(val interface{}, stream *Stream) {
  84. writeToStream(val, stream, encoder)
  85. }
  86. func (encoder *mapEncoder) isEmpty(ptr unsafe.Pointer) bool {
  87. mapInterface := encoder.mapInterface
  88. mapInterface.word = ptr
  89. realInterface := (*interface{})(unsafe.Pointer(&mapInterface))
  90. realVal := reflect.ValueOf(*realInterface)
  91. return realVal.Len() == 0
  92. }
  93. type mapInterfaceEncoder struct {
  94. mapType reflect.Type
  95. elemType reflect.Type
  96. elemEncoder Encoder
  97. mapInterface emptyInterface
  98. }
  99. func (encoder *mapInterfaceEncoder) encode(ptr unsafe.Pointer, stream *Stream) {
  100. mapInterface := encoder.mapInterface
  101. mapInterface.word = ptr
  102. realInterface := (*interface{})(unsafe.Pointer(&mapInterface))
  103. realVal := reflect.ValueOf(*realInterface)
  104. stream.WriteObjectStart()
  105. for i, key := range realVal.MapKeys() {
  106. if i != 0 {
  107. stream.WriteMore()
  108. }
  109. switch key.Interface().(type) {
  110. case string:
  111. stream.WriteObjectField(key.String())
  112. default:
  113. stream.Error = &json.UnsupportedTypeError{key.Type()}
  114. return
  115. }
  116. val := realVal.MapIndex(key).Interface()
  117. encoder.elemEncoder.encode(unsafe.Pointer(&val), stream)
  118. }
  119. stream.WriteObjectEnd()
  120. }
  121. func (encoder *mapInterfaceEncoder) encodeInterface(val interface{}, stream *Stream) {
  122. writeToStream(val, stream, encoder)
  123. }
  124. func (encoder *mapInterfaceEncoder) isEmpty(ptr unsafe.Pointer) bool {
  125. mapInterface := encoder.mapInterface
  126. mapInterface.word = ptr
  127. realInterface := (*interface{})(unsafe.Pointer(&mapInterface))
  128. realVal := reflect.ValueOf(*realInterface)
  129. return realVal.Len() == 0
  130. }