feature_reflect_object.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419
  1. package jsoniter
  2. import (
  3. "io"
  4. "fmt"
  5. "reflect"
  6. "unsafe"
  7. "strings"
  8. )
  9. func encoderOfStruct(typ reflect.Type) (Encoder, error) {
  10. structEncoder_ := &structEncoder{}
  11. for i := 0; i < typ.NumField(); i++ {
  12. field := typ.Field(i)
  13. var fieldNames []string
  14. for _, extension := range extensions {
  15. alternativeFieldNames, _ := extension(typ, &field)
  16. if alternativeFieldNames != nil {
  17. fieldNames = alternativeFieldNames
  18. }
  19. }
  20. tagParts := strings.Split(field.Tag.Get("json"), ",")
  21. // if fieldNames set by extension, use theirs, otherwise try tags
  22. if fieldNames == nil {
  23. /// tagParts[0] always present, even if no tags
  24. switch tagParts[0] {
  25. case "":
  26. fieldNames = []string{field.Name}
  27. case "-":
  28. fieldNames = []string{}
  29. default:
  30. fieldNames = []string{tagParts[0]}
  31. }
  32. }
  33. encoder, err := encoderOfType(field.Type)
  34. if err != nil {
  35. return prefix(fmt.Sprintf("{%s}", field.Name)).addToEncoder(encoder, err)
  36. }
  37. for _, fieldName := range fieldNames {
  38. if structEncoder_.firstField == nil {
  39. structEncoder_.firstField = &structFieldEncoder{&field, fieldName, encoder}
  40. } else {
  41. structEncoder_.fields = append(structEncoder_.fields, &structFieldEncoder{&field, fieldName, encoder})
  42. }
  43. }
  44. }
  45. if structEncoder_.firstField == nil {
  46. return &emptyStructEncoder{}, nil
  47. }
  48. return structEncoder_, nil
  49. }
  50. func decoderOfStruct(typ reflect.Type) (Decoder, error) {
  51. fields := map[string]*structFieldDecoder{}
  52. for i := 0; i < typ.NumField(); i++ {
  53. field := typ.Field(i)
  54. fieldDecoderKey := fmt.Sprintf("%s/%s", typ.String(), field.Name)
  55. var fieldNames []string
  56. for _, extension := range extensions {
  57. alternativeFieldNames, fun := extension(typ, &field)
  58. if alternativeFieldNames != nil {
  59. fieldNames = alternativeFieldNames
  60. }
  61. if fun != nil {
  62. fieldDecoders[fieldDecoderKey] = &funcDecoder{fun}
  63. }
  64. }
  65. decoder := fieldDecoders[fieldDecoderKey]
  66. tagParts := strings.Split(field.Tag.Get("json"), ",")
  67. // if fieldNames set by extension, use theirs, otherwise try tags
  68. if fieldNames == nil {
  69. /// tagParts[0] always present, even if no tags
  70. switch tagParts[0] {
  71. case "":
  72. fieldNames = []string{field.Name}
  73. case "-":
  74. fieldNames = []string{}
  75. default:
  76. fieldNames = []string{tagParts[0]}
  77. }
  78. }
  79. if decoder == nil {
  80. var err error
  81. decoder, err = decoderOfType(field.Type)
  82. if err != nil {
  83. return prefix(fmt.Sprintf("{%s}", field.Name)).addToDecoder(decoder, err)
  84. }
  85. }
  86. if len(tagParts) > 1 && tagParts[1] == "string" {
  87. decoder = &stringNumberDecoder{decoder}
  88. }
  89. for _, fieldName := range fieldNames {
  90. fields[fieldName] = &structFieldDecoder{&field, decoder}
  91. }
  92. }
  93. switch len(fields) {
  94. case 0:
  95. return &skipDecoder{typ}, nil
  96. case 1:
  97. for fieldName, fieldDecoder := range fields {
  98. return &oneFieldStructDecoder{typ, fieldName, fieldDecoder}, nil
  99. }
  100. case 2:
  101. var fieldName1 string
  102. var fieldName2 string
  103. var fieldDecoder1 *structFieldDecoder
  104. var fieldDecoder2 *structFieldDecoder
  105. for fieldName, fieldDecoder := range fields {
  106. if fieldName1 == "" {
  107. fieldName1 = fieldName
  108. fieldDecoder1 = fieldDecoder
  109. } else {
  110. fieldName2 = fieldName
  111. fieldDecoder2 = fieldDecoder
  112. }
  113. }
  114. return &twoFieldsStructDecoder{typ, fieldName1, fieldDecoder1, fieldName2, fieldDecoder2}, nil
  115. case 3:
  116. var fieldName1 string
  117. var fieldName2 string
  118. var fieldName3 string
  119. var fieldDecoder1 *structFieldDecoder
  120. var fieldDecoder2 *structFieldDecoder
  121. var fieldDecoder3 *structFieldDecoder
  122. for fieldName, fieldDecoder := range fields {
  123. if fieldName1 == "" {
  124. fieldName1 = fieldName
  125. fieldDecoder1 = fieldDecoder
  126. } else if fieldName2 == "" {
  127. fieldName2 = fieldName
  128. fieldDecoder2 = fieldDecoder
  129. } else {
  130. fieldName3 = fieldName
  131. fieldDecoder3 = fieldDecoder
  132. }
  133. }
  134. return &threeFieldsStructDecoder{typ,
  135. fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3}, nil
  136. case 4:
  137. var fieldName1 string
  138. var fieldName2 string
  139. var fieldName3 string
  140. var fieldName4 string
  141. var fieldDecoder1 *structFieldDecoder
  142. var fieldDecoder2 *structFieldDecoder
  143. var fieldDecoder3 *structFieldDecoder
  144. var fieldDecoder4 *structFieldDecoder
  145. for fieldName, fieldDecoder := range fields {
  146. if fieldName1 == "" {
  147. fieldName1 = fieldName
  148. fieldDecoder1 = fieldDecoder
  149. } else if fieldName2 == "" {
  150. fieldName2 = fieldName
  151. fieldDecoder2 = fieldDecoder
  152. } else if fieldName3 == "" {
  153. fieldName3 = fieldName
  154. fieldDecoder3 = fieldDecoder
  155. } else {
  156. fieldName4 = fieldName
  157. fieldDecoder4 = fieldDecoder
  158. }
  159. }
  160. return &fourFieldsStructDecoder{typ,
  161. fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
  162. fieldName4, fieldDecoder4}, nil
  163. }
  164. return &generalStructDecoder{typ, fields}, nil
  165. }
  166. type generalStructDecoder struct {
  167. typ reflect.Type
  168. fields map[string]*structFieldDecoder
  169. }
  170. func (decoder *generalStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  171. if !iter.readObjectStart() {
  172. return
  173. }
  174. field := iter.readObjectField()
  175. fieldDecoder := decoder.fields[field]
  176. if fieldDecoder == nil {
  177. iter.Skip()
  178. } else {
  179. fieldDecoder.decode(ptr, iter)
  180. }
  181. for iter.nextToken() == ',' {
  182. field = iter.readObjectField()
  183. fieldDecoder = decoder.fields[field]
  184. if fieldDecoder == nil {
  185. iter.Skip()
  186. } else {
  187. fieldDecoder.decode(ptr, iter)
  188. }
  189. }
  190. if iter.Error != nil && iter.Error != io.EOF {
  191. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  192. }
  193. }
  194. type skipDecoder struct {
  195. typ reflect.Type
  196. }
  197. func (decoder *skipDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  198. iter.Skip()
  199. if iter.Error != nil && iter.Error != io.EOF {
  200. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  201. }
  202. }
  203. type oneFieldStructDecoder struct {
  204. typ reflect.Type
  205. fieldName string
  206. fieldDecoder *structFieldDecoder
  207. }
  208. func (decoder *oneFieldStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  209. if !iter.readObjectStart() {
  210. return
  211. }
  212. field := iter.readObjectField()
  213. if field == decoder.fieldName {
  214. decoder.fieldDecoder.decode(ptr, iter)
  215. } else {
  216. iter.Skip()
  217. }
  218. for iter.nextToken() == ',' {
  219. field = iter.readObjectField()
  220. if field == decoder.fieldName {
  221. decoder.fieldDecoder.decode(ptr, iter)
  222. } else {
  223. iter.Skip()
  224. }
  225. }
  226. if iter.Error != nil && iter.Error != io.EOF {
  227. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  228. }
  229. }
  230. type twoFieldsStructDecoder struct {
  231. typ reflect.Type
  232. fieldName1 string
  233. fieldDecoder1 *structFieldDecoder
  234. fieldName2 string
  235. fieldDecoder2 *structFieldDecoder
  236. }
  237. func (decoder *twoFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  238. if !iter.readObjectStart() {
  239. return
  240. }
  241. field := iter.readObjectField()
  242. switch field {
  243. case decoder.fieldName1:
  244. decoder.fieldDecoder1.decode(ptr, iter)
  245. case decoder.fieldName2:
  246. decoder.fieldDecoder2.decode(ptr, iter)
  247. default:
  248. iter.Skip()
  249. }
  250. for iter.nextToken() == ',' {
  251. field = iter.readObjectField()
  252. switch field {
  253. case decoder.fieldName1:
  254. decoder.fieldDecoder1.decode(ptr, iter)
  255. case decoder.fieldName2:
  256. decoder.fieldDecoder2.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 threeFieldsStructDecoder struct {
  266. typ reflect.Type
  267. fieldName1 string
  268. fieldDecoder1 *structFieldDecoder
  269. fieldName2 string
  270. fieldDecoder2 *structFieldDecoder
  271. fieldName3 string
  272. fieldDecoder3 *structFieldDecoder
  273. }
  274. func (decoder *threeFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  275. if !iter.readObjectStart() {
  276. return
  277. }
  278. field := iter.readObjectField()
  279. switch field {
  280. case decoder.fieldName1:
  281. decoder.fieldDecoder1.decode(ptr, iter)
  282. case decoder.fieldName2:
  283. decoder.fieldDecoder2.decode(ptr, iter)
  284. case decoder.fieldName3:
  285. decoder.fieldDecoder3.decode(ptr, iter)
  286. default:
  287. iter.Skip()
  288. }
  289. for iter.nextToken() == ',' {
  290. field = iter.readObjectField()
  291. switch field {
  292. case decoder.fieldName1:
  293. decoder.fieldDecoder1.decode(ptr, iter)
  294. case decoder.fieldName2:
  295. decoder.fieldDecoder2.decode(ptr, iter)
  296. case decoder.fieldName3:
  297. decoder.fieldDecoder3.decode(ptr, iter)
  298. default:
  299. iter.Skip()
  300. }
  301. }
  302. if iter.Error != nil && iter.Error != io.EOF {
  303. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  304. }
  305. }
  306. type fourFieldsStructDecoder struct {
  307. typ reflect.Type
  308. fieldName1 string
  309. fieldDecoder1 *structFieldDecoder
  310. fieldName2 string
  311. fieldDecoder2 *structFieldDecoder
  312. fieldName3 string
  313. fieldDecoder3 *structFieldDecoder
  314. fieldName4 string
  315. fieldDecoder4 *structFieldDecoder
  316. }
  317. func (decoder *fourFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  318. if !iter.readObjectStart() {
  319. return
  320. }
  321. field := iter.readObjectField()
  322. switch field {
  323. case decoder.fieldName1:
  324. decoder.fieldDecoder1.decode(ptr, iter)
  325. case decoder.fieldName2:
  326. decoder.fieldDecoder2.decode(ptr, iter)
  327. case decoder.fieldName3:
  328. decoder.fieldDecoder3.decode(ptr, iter)
  329. case decoder.fieldName4:
  330. decoder.fieldDecoder4.decode(ptr, iter)
  331. default:
  332. iter.Skip()
  333. }
  334. for iter.nextToken() == ',' {
  335. field = iter.readObjectField()
  336. switch field {
  337. case decoder.fieldName1:
  338. decoder.fieldDecoder1.decode(ptr, iter)
  339. case decoder.fieldName2:
  340. decoder.fieldDecoder2.decode(ptr, iter)
  341. case decoder.fieldName3:
  342. decoder.fieldDecoder3.decode(ptr, iter)
  343. case decoder.fieldName4:
  344. decoder.fieldDecoder4.decode(ptr, iter)
  345. default:
  346. iter.Skip()
  347. }
  348. }
  349. if iter.Error != nil && iter.Error != io.EOF {
  350. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  351. }
  352. }
  353. type structFieldDecoder struct {
  354. field *reflect.StructField
  355. fieldDecoder Decoder
  356. }
  357. func (decoder *structFieldDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  358. fieldPtr := uintptr(ptr) + decoder.field.Offset
  359. decoder.fieldDecoder.decode(unsafe.Pointer(fieldPtr), iter)
  360. if iter.Error != nil && iter.Error != io.EOF {
  361. iter.Error = fmt.Errorf("%s: %s", decoder.field.Name, iter.Error.Error())
  362. }
  363. }
  364. type structFieldEncoder struct {
  365. field *reflect.StructField
  366. fieldName string
  367. fieldEncoder Encoder
  368. }
  369. func (encoder *structFieldEncoder) encode(ptr unsafe.Pointer, stream *Stream) {
  370. fieldPtr := uintptr(ptr) + encoder.field.Offset
  371. stream.WriteObjectField(encoder.fieldName)
  372. encoder.fieldEncoder.encode(unsafe.Pointer(fieldPtr), stream)
  373. if stream.Error != nil && stream.Error != io.EOF {
  374. stream.Error = fmt.Errorf("%s: %s", encoder.field.Name, stream.Error.Error())
  375. }
  376. }
  377. type structEncoder struct {
  378. firstField *structFieldEncoder
  379. fields []*structFieldEncoder
  380. }
  381. func (encoder *structEncoder) encode(ptr unsafe.Pointer, stream *Stream) {
  382. stream.WriteObjectStart()
  383. encoder.firstField.encode(ptr, stream)
  384. for _, field := range encoder.fields {
  385. stream.WriteMore()
  386. field.encode(ptr, stream)
  387. }
  388. stream.WriteObjectEnd()
  389. }
  390. type emptyStructEncoder struct {
  391. }
  392. func (encoder *emptyStructEncoder) encode(ptr unsafe.Pointer, stream *Stream) {
  393. stream.WriteEmptyObject()
  394. }