feature_reflect_object.go 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. package jsoniter
  2. import (
  3. "io"
  4. "fmt"
  5. "reflect"
  6. "unsafe"
  7. "strings"
  8. )
  9. func decoderOfStruct(typ reflect.Type) (Decoder, error) {
  10. fields := map[string]*structFieldDecoder{}
  11. for i := 0; i < typ.NumField(); i++ {
  12. field := typ.Field(i)
  13. fieldDecoderKey := fmt.Sprintf("%s/%s", typ.String(), field.Name)
  14. var fieldNames []string
  15. for _, extension := range extensions {
  16. alternativeFieldNames, fun := extension(typ, &field)
  17. if alternativeFieldNames != nil {
  18. fieldNames = alternativeFieldNames
  19. }
  20. if fun != nil {
  21. fieldDecoders[fieldDecoderKey] = &funcDecoder{fun}
  22. }
  23. }
  24. decoder := fieldDecoders[fieldDecoderKey]
  25. tagParts := strings.Split(field.Tag.Get("json"), ",")
  26. // if fieldNames set by extension, use theirs, otherwise try tags
  27. if fieldNames == nil {
  28. /// tagParts[0] always present, even if no tags
  29. switch tagParts[0] {
  30. case "":
  31. fieldNames = []string{field.Name}
  32. case "-":
  33. fieldNames = []string{}
  34. default:
  35. fieldNames = []string{tagParts[0]}
  36. }
  37. }
  38. if decoder == nil {
  39. var err error
  40. decoder, err = decoderOfPtr(field.Type)
  41. if err != nil {
  42. return prefix(fmt.Sprintf("{%s}", field.Name)).addTo(decoder, err)
  43. }
  44. }
  45. if len(tagParts) > 1 && tagParts[1] == "string" {
  46. decoder = &stringNumberDecoder{decoder}
  47. }
  48. for _, fieldName := range fieldNames {
  49. fields[fieldName] = &structFieldDecoder{&field, decoder}
  50. }
  51. }
  52. switch len(fields) {
  53. case 0:
  54. return &skipDecoder{typ}, nil
  55. case 1:
  56. for fieldName, fieldDecoder := range fields {
  57. return &oneFieldStructDecoder{typ, fieldName, fieldDecoder}, nil
  58. }
  59. case 2:
  60. var fieldName1 string
  61. var fieldName2 string
  62. var fieldDecoder1 *structFieldDecoder
  63. var fieldDecoder2 *structFieldDecoder
  64. for fieldName, fieldDecoder := range fields {
  65. if fieldName1 == "" {
  66. fieldName1 = fieldName
  67. fieldDecoder1 = fieldDecoder
  68. } else {
  69. fieldName2 = fieldName
  70. fieldDecoder2 = fieldDecoder
  71. }
  72. }
  73. return &twoFieldsStructDecoder{typ, fieldName1, fieldDecoder1, fieldName2, fieldDecoder2}, nil
  74. case 3:
  75. var fieldName1 string
  76. var fieldName2 string
  77. var fieldName3 string
  78. var fieldDecoder1 *structFieldDecoder
  79. var fieldDecoder2 *structFieldDecoder
  80. var fieldDecoder3 *structFieldDecoder
  81. for fieldName, fieldDecoder := range fields {
  82. if fieldName1 == "" {
  83. fieldName1 = fieldName
  84. fieldDecoder1 = fieldDecoder
  85. } else if fieldName2 == "" {
  86. fieldName2 = fieldName
  87. fieldDecoder2 = fieldDecoder
  88. } else {
  89. fieldName3 = fieldName
  90. fieldDecoder3 = fieldDecoder
  91. }
  92. }
  93. return &threeFieldsStructDecoder{typ,
  94. fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3}, nil
  95. case 4:
  96. var fieldName1 string
  97. var fieldName2 string
  98. var fieldName3 string
  99. var fieldName4 string
  100. var fieldDecoder1 *structFieldDecoder
  101. var fieldDecoder2 *structFieldDecoder
  102. var fieldDecoder3 *structFieldDecoder
  103. var fieldDecoder4 *structFieldDecoder
  104. for fieldName, fieldDecoder := range fields {
  105. if fieldName1 == "" {
  106. fieldName1 = fieldName
  107. fieldDecoder1 = fieldDecoder
  108. } else if fieldName2 == "" {
  109. fieldName2 = fieldName
  110. fieldDecoder2 = fieldDecoder
  111. } else if fieldName3 == "" {
  112. fieldName3 = fieldName
  113. fieldDecoder3 = fieldDecoder
  114. } else {
  115. fieldName4 = fieldName
  116. fieldDecoder4 = fieldDecoder
  117. }
  118. }
  119. return &fourFieldsStructDecoder{typ,
  120. fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
  121. fieldName4, fieldDecoder4}, nil
  122. }
  123. return &generalStructDecoder{typ, fields}, nil
  124. }
  125. type generalStructDecoder struct {
  126. typ reflect.Type
  127. fields map[string]*structFieldDecoder
  128. }
  129. func (decoder *generalStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  130. if !iter.readObjectStart() {
  131. return
  132. }
  133. field := iter.readObjectField()
  134. fieldDecoder := decoder.fields[field]
  135. if fieldDecoder == nil {
  136. iter.Skip()
  137. } else {
  138. fieldDecoder.decode(ptr, iter)
  139. }
  140. for iter.nextToken() == ',' {
  141. field = iter.readObjectField()
  142. fieldDecoder = decoder.fields[field]
  143. if fieldDecoder == nil {
  144. iter.Skip()
  145. } else {
  146. fieldDecoder.decode(ptr, iter)
  147. }
  148. }
  149. if iter.Error != nil && iter.Error != io.EOF {
  150. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  151. }
  152. }
  153. type skipDecoder struct {
  154. typ reflect.Type
  155. }
  156. func (decoder *skipDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  157. iter.Skip()
  158. if iter.Error != nil && iter.Error != io.EOF {
  159. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  160. }
  161. }
  162. type oneFieldStructDecoder struct {
  163. typ reflect.Type
  164. fieldName string
  165. fieldDecoder *structFieldDecoder
  166. }
  167. func (decoder *oneFieldStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  168. if !iter.readObjectStart() {
  169. return
  170. }
  171. field := iter.readObjectField()
  172. if field == decoder.fieldName {
  173. decoder.fieldDecoder.decode(ptr, iter)
  174. } else {
  175. iter.Skip()
  176. }
  177. for iter.nextToken() == ',' {
  178. field = iter.readObjectField()
  179. if field == decoder.fieldName {
  180. decoder.fieldDecoder.decode(ptr, iter)
  181. } else {
  182. iter.Skip()
  183. }
  184. }
  185. if iter.Error != nil && iter.Error != io.EOF {
  186. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  187. }
  188. }
  189. type twoFieldsStructDecoder struct {
  190. typ reflect.Type
  191. fieldName1 string
  192. fieldDecoder1 *structFieldDecoder
  193. fieldName2 string
  194. fieldDecoder2 *structFieldDecoder
  195. }
  196. func (decoder *twoFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  197. if !iter.readObjectStart() {
  198. return
  199. }
  200. field := iter.readObjectField()
  201. switch field {
  202. case decoder.fieldName1:
  203. decoder.fieldDecoder1.decode(ptr, iter)
  204. case decoder.fieldName2:
  205. decoder.fieldDecoder2.decode(ptr, iter)
  206. default:
  207. iter.Skip()
  208. }
  209. for iter.nextToken() == ',' {
  210. field = iter.readObjectField()
  211. switch field {
  212. case decoder.fieldName1:
  213. decoder.fieldDecoder1.decode(ptr, iter)
  214. case decoder.fieldName2:
  215. decoder.fieldDecoder2.decode(ptr, iter)
  216. default:
  217. iter.Skip()
  218. }
  219. }
  220. if iter.Error != nil && iter.Error != io.EOF {
  221. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  222. }
  223. }
  224. type threeFieldsStructDecoder struct {
  225. typ reflect.Type
  226. fieldName1 string
  227. fieldDecoder1 *structFieldDecoder
  228. fieldName2 string
  229. fieldDecoder2 *structFieldDecoder
  230. fieldName3 string
  231. fieldDecoder3 *structFieldDecoder
  232. }
  233. func (decoder *threeFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  234. if !iter.readObjectStart() {
  235. return
  236. }
  237. field := iter.readObjectField()
  238. switch field {
  239. case decoder.fieldName1:
  240. decoder.fieldDecoder1.decode(ptr, iter)
  241. case decoder.fieldName2:
  242. decoder.fieldDecoder2.decode(ptr, iter)
  243. case decoder.fieldName3:
  244. decoder.fieldDecoder3.decode(ptr, iter)
  245. default:
  246. iter.Skip()
  247. }
  248. for iter.nextToken() == ',' {
  249. field = iter.readObjectField()
  250. switch field {
  251. case decoder.fieldName1:
  252. decoder.fieldDecoder1.decode(ptr, iter)
  253. case decoder.fieldName2:
  254. decoder.fieldDecoder2.decode(ptr, iter)
  255. case decoder.fieldName3:
  256. decoder.fieldDecoder3.decode(ptr, iter)
  257. default:
  258. iter.Skip()
  259. }
  260. }
  261. if iter.Error != nil && iter.Error != io.EOF {
  262. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  263. }
  264. }
  265. type fourFieldsStructDecoder struct {
  266. typ reflect.Type
  267. fieldName1 string
  268. fieldDecoder1 *structFieldDecoder
  269. fieldName2 string
  270. fieldDecoder2 *structFieldDecoder
  271. fieldName3 string
  272. fieldDecoder3 *structFieldDecoder
  273. fieldName4 string
  274. fieldDecoder4 *structFieldDecoder
  275. }
  276. func (decoder *fourFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  277. if !iter.readObjectStart() {
  278. return
  279. }
  280. field := iter.readObjectField()
  281. switch field {
  282. case decoder.fieldName1:
  283. decoder.fieldDecoder1.decode(ptr, iter)
  284. case decoder.fieldName2:
  285. decoder.fieldDecoder2.decode(ptr, iter)
  286. case decoder.fieldName3:
  287. decoder.fieldDecoder3.decode(ptr, iter)
  288. case decoder.fieldName4:
  289. decoder.fieldDecoder4.decode(ptr, iter)
  290. default:
  291. iter.Skip()
  292. }
  293. for iter.nextToken() == ',' {
  294. field = iter.readObjectField()
  295. switch field {
  296. case decoder.fieldName1:
  297. decoder.fieldDecoder1.decode(ptr, iter)
  298. case decoder.fieldName2:
  299. decoder.fieldDecoder2.decode(ptr, iter)
  300. case decoder.fieldName3:
  301. decoder.fieldDecoder3.decode(ptr, iter)
  302. case decoder.fieldName4:
  303. decoder.fieldDecoder4.decode(ptr, iter)
  304. default:
  305. iter.Skip()
  306. }
  307. }
  308. if iter.Error != nil && iter.Error != io.EOF {
  309. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  310. }
  311. }
  312. type structFieldDecoder struct {
  313. field *reflect.StructField
  314. fieldDecoder Decoder
  315. }
  316. func (decoder *structFieldDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  317. fieldPtr := uintptr(ptr) + decoder.field.Offset
  318. decoder.fieldDecoder.decode(unsafe.Pointer(fieldPtr), iter)
  319. if iter.Error != nil && iter.Error != io.EOF {
  320. iter.Error = fmt.Errorf("%s: %s", decoder.field.Name, iter.Error.Error())
  321. }
  322. }