feature_reflect_object.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  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. fieldBytes := iter.readObjectFieldAsBytes()
  175. field := *(*string)(unsafe.Pointer(&fieldBytes))
  176. fieldDecoder := decoder.fields[field]
  177. if fieldDecoder == nil {
  178. iter.Skip()
  179. } else {
  180. fieldDecoder.decode(ptr, iter)
  181. }
  182. for iter.nextToken() == ',' {
  183. fieldBytes = iter.readObjectFieldAsBytes()
  184. field = *(*string)(unsafe.Pointer(&fieldBytes))
  185. fieldDecoder = decoder.fields[field]
  186. if fieldDecoder == nil {
  187. iter.Skip()
  188. } else {
  189. fieldDecoder.decode(ptr, iter)
  190. }
  191. }
  192. if iter.Error != nil && iter.Error != io.EOF {
  193. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  194. }
  195. }
  196. type skipDecoder struct {
  197. typ reflect.Type
  198. }
  199. func (decoder *skipDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  200. iter.Skip()
  201. if iter.Error != nil && iter.Error != io.EOF {
  202. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  203. }
  204. }
  205. type oneFieldStructDecoder struct {
  206. typ reflect.Type
  207. fieldName string
  208. fieldDecoder *structFieldDecoder
  209. }
  210. func (decoder *oneFieldStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  211. if !iter.readObjectStart() {
  212. return
  213. }
  214. fieldBytes := iter.readObjectFieldAsBytes()
  215. field := *(*string)(unsafe.Pointer(&fieldBytes))
  216. if field == decoder.fieldName {
  217. decoder.fieldDecoder.decode(ptr, iter)
  218. } else {
  219. iter.Skip()
  220. }
  221. for iter.nextToken() == ',' {
  222. fieldBytes = iter.readObjectFieldAsBytes()
  223. field = *(*string)(unsafe.Pointer(&fieldBytes))
  224. if field == decoder.fieldName {
  225. decoder.fieldDecoder.decode(ptr, iter)
  226. } else {
  227. iter.Skip()
  228. }
  229. }
  230. if iter.Error != nil && iter.Error != io.EOF {
  231. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  232. }
  233. }
  234. type twoFieldsStructDecoder struct {
  235. typ reflect.Type
  236. fieldName1 string
  237. fieldDecoder1 *structFieldDecoder
  238. fieldName2 string
  239. fieldDecoder2 *structFieldDecoder
  240. }
  241. func (decoder *twoFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  242. if !iter.readObjectStart() {
  243. return
  244. }
  245. fieldBytes := iter.readObjectFieldAsBytes()
  246. field := *(*string)(unsafe.Pointer(&fieldBytes))
  247. switch field {
  248. case decoder.fieldName1:
  249. decoder.fieldDecoder1.decode(ptr, iter)
  250. case decoder.fieldName2:
  251. decoder.fieldDecoder2.decode(ptr, iter)
  252. default:
  253. iter.Skip()
  254. }
  255. for iter.nextToken() == ',' {
  256. fieldBytes = iter.readObjectFieldAsBytes()
  257. field = *(*string)(unsafe.Pointer(&fieldBytes))
  258. switch field {
  259. case decoder.fieldName1:
  260. decoder.fieldDecoder1.decode(ptr, iter)
  261. case decoder.fieldName2:
  262. decoder.fieldDecoder2.decode(ptr, iter)
  263. default:
  264. iter.Skip()
  265. }
  266. }
  267. if iter.Error != nil && iter.Error != io.EOF {
  268. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  269. }
  270. }
  271. type threeFieldsStructDecoder struct {
  272. typ reflect.Type
  273. fieldName1 string
  274. fieldDecoder1 *structFieldDecoder
  275. fieldName2 string
  276. fieldDecoder2 *structFieldDecoder
  277. fieldName3 string
  278. fieldDecoder3 *structFieldDecoder
  279. }
  280. func (decoder *threeFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  281. if !iter.readObjectStart() {
  282. return
  283. }
  284. fieldBytes := iter.readObjectFieldAsBytes()
  285. field := *(*string)(unsafe.Pointer(&fieldBytes))
  286. switch field {
  287. case decoder.fieldName1:
  288. decoder.fieldDecoder1.decode(ptr, iter)
  289. case decoder.fieldName2:
  290. decoder.fieldDecoder2.decode(ptr, iter)
  291. case decoder.fieldName3:
  292. decoder.fieldDecoder3.decode(ptr, iter)
  293. default:
  294. iter.Skip()
  295. }
  296. for iter.nextToken() == ',' {
  297. fieldBytes = iter.readObjectFieldAsBytes()
  298. field = *(*string)(unsafe.Pointer(&fieldBytes))
  299. switch field {
  300. case decoder.fieldName1:
  301. decoder.fieldDecoder1.decode(ptr, iter)
  302. case decoder.fieldName2:
  303. decoder.fieldDecoder2.decode(ptr, iter)
  304. case decoder.fieldName3:
  305. decoder.fieldDecoder3.decode(ptr, iter)
  306. default:
  307. iter.Skip()
  308. }
  309. }
  310. if iter.Error != nil && iter.Error != io.EOF {
  311. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  312. }
  313. }
  314. type fourFieldsStructDecoder struct {
  315. typ reflect.Type
  316. fieldName1 string
  317. fieldDecoder1 *structFieldDecoder
  318. fieldName2 string
  319. fieldDecoder2 *structFieldDecoder
  320. fieldName3 string
  321. fieldDecoder3 *structFieldDecoder
  322. fieldName4 string
  323. fieldDecoder4 *structFieldDecoder
  324. }
  325. func (decoder *fourFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  326. if !iter.readObjectStart() {
  327. return
  328. }
  329. fieldBytes := iter.readObjectFieldAsBytes()
  330. field := *(*string)(unsafe.Pointer(&fieldBytes))
  331. switch field {
  332. case decoder.fieldName1:
  333. decoder.fieldDecoder1.decode(ptr, iter)
  334. case decoder.fieldName2:
  335. decoder.fieldDecoder2.decode(ptr, iter)
  336. case decoder.fieldName3:
  337. decoder.fieldDecoder3.decode(ptr, iter)
  338. case decoder.fieldName4:
  339. decoder.fieldDecoder4.decode(ptr, iter)
  340. default:
  341. iter.Skip()
  342. }
  343. for iter.nextToken() == ',' {
  344. fieldBytes = iter.readObjectFieldAsBytes()
  345. field = *(*string)(unsafe.Pointer(&fieldBytes))
  346. switch field {
  347. case decoder.fieldName1:
  348. decoder.fieldDecoder1.decode(ptr, iter)
  349. case decoder.fieldName2:
  350. decoder.fieldDecoder2.decode(ptr, iter)
  351. case decoder.fieldName3:
  352. decoder.fieldDecoder3.decode(ptr, iter)
  353. case decoder.fieldName4:
  354. decoder.fieldDecoder4.decode(ptr, iter)
  355. default:
  356. iter.Skip()
  357. }
  358. }
  359. if iter.Error != nil && iter.Error != io.EOF {
  360. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  361. }
  362. }
  363. type structFieldDecoder struct {
  364. field *reflect.StructField
  365. fieldDecoder Decoder
  366. }
  367. func (decoder *structFieldDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  368. fieldPtr := uintptr(ptr) + decoder.field.Offset
  369. decoder.fieldDecoder.decode(unsafe.Pointer(fieldPtr), iter)
  370. if iter.Error != nil && iter.Error != io.EOF {
  371. iter.Error = fmt.Errorf("%s: %s", decoder.field.Name, iter.Error.Error())
  372. }
  373. }
  374. type structFieldEncoder struct {
  375. field *reflect.StructField
  376. fieldName string
  377. fieldEncoder Encoder
  378. }
  379. func (encoder *structFieldEncoder) encode(ptr unsafe.Pointer, stream *Stream) {
  380. fieldPtr := uintptr(ptr) + encoder.field.Offset
  381. stream.WriteObjectField(encoder.fieldName)
  382. encoder.fieldEncoder.encode(unsafe.Pointer(fieldPtr), stream)
  383. if stream.Error != nil && stream.Error != io.EOF {
  384. stream.Error = fmt.Errorf("%s: %s", encoder.field.Name, stream.Error.Error())
  385. }
  386. }
  387. func (encoder *structFieldEncoder) encodeInterface(val interface{}, stream *Stream) {
  388. WriteToStream(val, stream, encoder)
  389. }
  390. type structEncoder struct {
  391. firstField *structFieldEncoder
  392. fields []*structFieldEncoder
  393. }
  394. func (encoder *structEncoder) encode(ptr unsafe.Pointer, stream *Stream) {
  395. stream.WriteObjectStart()
  396. encoder.firstField.encode(ptr, stream)
  397. for _, field := range encoder.fields {
  398. stream.WriteMore()
  399. field.encode(ptr, stream)
  400. }
  401. stream.WriteObjectEnd()
  402. }
  403. func (encoder *structEncoder) encodeInterface(val interface{}, stream *Stream) {
  404. WriteToStream(val, stream, encoder)
  405. }
  406. type emptyStructEncoder struct {
  407. }
  408. func (encoder *emptyStructEncoder) encode(ptr unsafe.Pointer, stream *Stream) {
  409. stream.WriteEmptyObject()
  410. }
  411. func (encoder *emptyStructEncoder) encodeInterface(val interface{}, stream *Stream) {
  412. WriteToStream(val, stream, encoder)
  413. }