reflect_map.go 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. package jsoniter
  2. import (
  3. "fmt"
  4. "github.com/modern-go/reflect2"
  5. "reflect"
  6. "sort"
  7. "unsafe"
  8. )
  9. func decoderOfMap(ctx *ctx, typ reflect2.Type) ValDecoder {
  10. mapType := typ.(*reflect2.UnsafeMapType)
  11. keyDecoder := decoderOfMapKey(ctx.append("[mapKey]"), mapType.Key())
  12. elemDecoder := decoderOfType(ctx.append("[mapElem]"), mapType.Elem())
  13. return &mapDecoder{
  14. mapType: mapType,
  15. keyType: mapType.Key(),
  16. elemType: mapType.Elem(),
  17. keyDecoder: keyDecoder,
  18. elemDecoder: elemDecoder,
  19. }
  20. }
  21. func encoderOfMap(ctx *ctx, typ reflect2.Type) ValEncoder {
  22. mapType := typ.(*reflect2.UnsafeMapType)
  23. if ctx.sortMapKeys {
  24. return &sortKeysMapEncoder{
  25. mapType: mapType,
  26. keyEncoder: encoderOfMapKey(ctx.append("[mapKey]"), mapType.Key()),
  27. elemEncoder: encoderOfType(ctx.append("[mapElem]"), mapType.Elem()),
  28. }
  29. }
  30. return &mapEncoder{
  31. mapType: mapType,
  32. keyEncoder: encoderOfMapKey(ctx.append("[mapKey]"), mapType.Key()),
  33. elemEncoder: encoderOfType(ctx.append("[mapElem]"), mapType.Elem()),
  34. }
  35. }
  36. func decoderOfMapKey(ctx *ctx, typ reflect2.Type) ValDecoder {
  37. for _, extension := range ctx.extensions {
  38. decoder := extension.CreateMapKeyDecoder(typ)
  39. if decoder != nil {
  40. return decoder
  41. }
  42. }
  43. switch typ.Kind() {
  44. case reflect.String:
  45. return decoderOfType(ctx, reflect2.DefaultTypeOfKind(reflect.String))
  46. case reflect.Bool,
  47. reflect.Uint8, reflect.Int8,
  48. reflect.Uint16, reflect.Int16,
  49. reflect.Uint32, reflect.Int32,
  50. reflect.Uint64, reflect.Int64,
  51. reflect.Uint, reflect.Int,
  52. reflect.Float32, reflect.Float64,
  53. reflect.Uintptr:
  54. typ = reflect2.DefaultTypeOfKind(typ.Kind())
  55. return &numericMapKeyDecoder{decoderOfType(ctx, typ)}
  56. default:
  57. ptrType := reflect2.PtrTo(typ)
  58. if ptrType.Implements(textMarshalerType) {
  59. return &referenceDecoder{
  60. &textUnmarshalerDecoder{
  61. valType: ptrType,
  62. },
  63. }
  64. }
  65. if typ.Implements(textMarshalerType) {
  66. return &textUnmarshalerDecoder{
  67. valType: typ,
  68. }
  69. }
  70. return &lazyErrorDecoder{err: fmt.Errorf("unsupported map key type: %v", typ)}
  71. }
  72. }
  73. func encoderOfMapKey(ctx *ctx, typ reflect2.Type) ValEncoder {
  74. for _, extension := range ctx.extensions {
  75. encoder := extension.CreateMapKeyEncoder(typ)
  76. if encoder != nil {
  77. return encoder
  78. }
  79. }
  80. switch typ.Kind() {
  81. case reflect.String:
  82. return encoderOfType(ctx, reflect2.DefaultTypeOfKind(reflect.String))
  83. case reflect.Bool,
  84. reflect.Uint8, reflect.Int8,
  85. reflect.Uint16, reflect.Int16,
  86. reflect.Uint32, reflect.Int32,
  87. reflect.Uint64, reflect.Int64,
  88. reflect.Uint, reflect.Int,
  89. reflect.Float32, reflect.Float64,
  90. reflect.Uintptr:
  91. typ = reflect2.DefaultTypeOfKind(typ.Kind())
  92. return &numericMapKeyEncoder{encoderOfType(ctx, typ)}
  93. default:
  94. if typ == textMarshalerType {
  95. return &directTextMarshalerEncoder{
  96. stringEncoder: ctx.EncoderOf(reflect2.TypeOf("")),
  97. }
  98. }
  99. if typ.Implements(textMarshalerType) {
  100. return &textMarshalerEncoder{
  101. valType: typ,
  102. stringEncoder: ctx.EncoderOf(reflect2.TypeOf("")),
  103. }
  104. }
  105. return &lazyErrorEncoder{err: fmt.Errorf("unsupported map key type: %v", typ)}
  106. }
  107. }
  108. type mapDecoder struct {
  109. mapType *reflect2.UnsafeMapType
  110. keyType reflect2.Type
  111. elemType reflect2.Type
  112. keyDecoder ValDecoder
  113. elemDecoder ValDecoder
  114. }
  115. func (decoder *mapDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  116. mapType := decoder.mapType
  117. c := iter.nextToken()
  118. if c == 'n' {
  119. iter.skipThreeBytes('u', 'l', 'l')
  120. *(*unsafe.Pointer)(ptr) = nil
  121. mapType.UnsafeSet(ptr, mapType.UnsafeNew())
  122. return
  123. }
  124. if mapType.UnsafeIsNil(ptr) {
  125. mapType.UnsafeSet(ptr, mapType.UnsafeMakeMap(0))
  126. }
  127. if c != '{' {
  128. iter.ReportError("ReadMapCB", `expect { or n, but found `+string([]byte{c}))
  129. return
  130. }
  131. c = iter.nextToken()
  132. if c == '}' {
  133. return
  134. }
  135. if c != '"' {
  136. iter.ReportError("ReadMapCB", `expect " after }, but found `+string([]byte{c}))
  137. return
  138. }
  139. iter.unreadByte()
  140. key := decoder.keyType.UnsafeNew()
  141. decoder.keyDecoder.Decode(key, iter)
  142. c = iter.nextToken()
  143. if c != ':' {
  144. iter.ReportError("ReadMapCB", "expect : after object field, but found "+string([]byte{c}))
  145. return
  146. }
  147. elem := decoder.elemType.UnsafeNew()
  148. decoder.elemDecoder.Decode(elem, iter)
  149. decoder.mapType.UnsafeSetIndex(ptr, key, elem)
  150. for c = iter.nextToken(); c == ','; c = iter.nextToken() {
  151. key := decoder.keyType.UnsafeNew()
  152. decoder.keyDecoder.Decode(key, iter)
  153. c = iter.nextToken()
  154. if c != ':' {
  155. iter.ReportError("ReadMapCB", "expect : after object field, but found "+string([]byte{c}))
  156. return
  157. }
  158. elem := decoder.elemType.UnsafeNew()
  159. decoder.elemDecoder.Decode(elem, iter)
  160. decoder.mapType.UnsafeSetIndex(ptr, key, elem)
  161. }
  162. if c != '}' {
  163. iter.ReportError("ReadMapCB", `expect }, but found `+string([]byte{c}))
  164. }
  165. }
  166. type numericMapKeyDecoder struct {
  167. decoder ValDecoder
  168. }
  169. func (decoder *numericMapKeyDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  170. c := iter.nextToken()
  171. if c != '"' {
  172. iter.ReportError("ReadMapCB", `expect ", but found `+string([]byte{c}))
  173. return
  174. }
  175. decoder.decoder.Decode(ptr, iter)
  176. c = iter.nextToken()
  177. if c != '"' {
  178. iter.ReportError("ReadMapCB", `expect ", but found `+string([]byte{c}))
  179. return
  180. }
  181. }
  182. type numericMapKeyEncoder struct {
  183. encoder ValEncoder
  184. }
  185. func (encoder *numericMapKeyEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
  186. stream.writeByte('"')
  187. encoder.encoder.Encode(ptr, stream)
  188. stream.writeByte('"')
  189. }
  190. func (encoder *numericMapKeyEncoder) IsEmpty(ptr unsafe.Pointer) bool {
  191. return false
  192. }
  193. type mapEncoder struct {
  194. mapType *reflect2.UnsafeMapType
  195. keyEncoder ValEncoder
  196. elemEncoder ValEncoder
  197. }
  198. func (encoder *mapEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
  199. stream.WriteObjectStart()
  200. iter := encoder.mapType.UnsafeIterate(ptr)
  201. for i := 0; iter.HasNext(); i++ {
  202. if i != 0 {
  203. stream.WriteMore()
  204. }
  205. key, elem := iter.UnsafeNext()
  206. encoder.keyEncoder.Encode(key, stream)
  207. if stream.indention > 0 {
  208. stream.writeTwoBytes(byte(':'), byte(' '))
  209. } else {
  210. stream.writeByte(':')
  211. }
  212. encoder.elemEncoder.Encode(elem, stream)
  213. }
  214. stream.WriteObjectEnd()
  215. }
  216. func (encoder *mapEncoder) IsEmpty(ptr unsafe.Pointer) bool {
  217. iter := encoder.mapType.UnsafeIterate(ptr)
  218. return !iter.HasNext()
  219. }
  220. type sortKeysMapEncoder struct {
  221. mapType *reflect2.UnsafeMapType
  222. keyEncoder ValEncoder
  223. elemEncoder ValEncoder
  224. }
  225. func (encoder *sortKeysMapEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
  226. if *(*unsafe.Pointer)(ptr) == nil {
  227. stream.WriteNil()
  228. return
  229. }
  230. stream.WriteObjectStart()
  231. mapIter := encoder.mapType.UnsafeIterate(ptr)
  232. subStream := stream.cfg.BorrowStream(nil)
  233. subIter := stream.cfg.BorrowIterator(nil)
  234. keyValues := encodedKeyValues{}
  235. for mapIter.HasNext() {
  236. subStream.buf = make([]byte, 0, 64)
  237. key, elem := mapIter.UnsafeNext()
  238. encoder.keyEncoder.Encode(key, subStream)
  239. encodedKey := subStream.Buffer()
  240. subIter.ResetBytes(encodedKey)
  241. decodedKey := subIter.ReadString()
  242. if stream.indention > 0 {
  243. subStream.writeTwoBytes(byte(':'), byte(' '))
  244. } else {
  245. subStream.writeByte(':')
  246. }
  247. encoder.elemEncoder.Encode(elem, subStream)
  248. keyValues = append(keyValues, encodedKV{
  249. key: decodedKey,
  250. keyValue: subStream.Buffer(),
  251. })
  252. }
  253. sort.Sort(keyValues)
  254. for i, keyValue := range keyValues {
  255. if i != 0 {
  256. stream.WriteMore()
  257. }
  258. stream.Write(keyValue.keyValue)
  259. }
  260. stream.WriteObjectEnd()
  261. stream.cfg.ReturnStream(subStream)
  262. stream.cfg.ReturnIterator(subIter)
  263. }
  264. func (encoder *sortKeysMapEncoder) IsEmpty(ptr unsafe.Pointer) bool {
  265. iter := encoder.mapType.UnsafeIterate(ptr)
  266. return !iter.HasNext()
  267. }
  268. type encodedKeyValues []encodedKV
  269. type encodedKV struct {
  270. key string
  271. keyValue []byte
  272. }
  273. func (sv encodedKeyValues) Len() int { return len(sv) }
  274. func (sv encodedKeyValues) Swap(i, j int) { sv[i], sv[j] = sv[j], sv[i] }
  275. func (sv encodedKeyValues) Less(i, j int) bool { return sv[i].key < sv[j].key }