feature_reflect.go 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770
  1. package jsoniter
  2. import (
  3. "errors"
  4. "fmt"
  5. "io"
  6. "reflect"
  7. "strconv"
  8. "strings"
  9. "sync/atomic"
  10. "unsafe"
  11. )
  12. /*
  13. Reflection on type to create decoders, which is then cached
  14. Reflection on value is avoided as we can, as the reflect.Value itself will allocate, with following exceptions
  15. 1. create instance of new value, for example *int will need a int to be allocated
  16. 2. append to slice, if the existing cap is not enough, allocate will be done using Reflect.New
  17. 3. assignment to map, both key and value will be reflect.Value
  18. For a simple struct binding, it will be reflect.Value free and allocation free
  19. */
  20. // Decoder works like a father class for sub-type decoders
  21. type Decoder interface {
  22. decode(ptr unsafe.Pointer, iter *Iterator)
  23. }
  24. type optionalDecoder struct {
  25. valueType reflect.Type
  26. valueDecoder Decoder
  27. }
  28. func (decoder *optionalDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  29. if iter.ReadNil() {
  30. *((*unsafe.Pointer)(ptr)) = nil
  31. } else {
  32. if *((*unsafe.Pointer)(ptr)) == nil {
  33. // pointer to null, we have to allocate memory to hold the value
  34. value := reflect.New(decoder.valueType)
  35. decoder.valueDecoder.decode(unsafe.Pointer(value.Pointer()), iter)
  36. *((*uintptr)(ptr)) = value.Pointer()
  37. } else {
  38. // reuse existing instance
  39. decoder.valueDecoder.decode(*((*unsafe.Pointer)(ptr)), iter)
  40. }
  41. }
  42. }
  43. type generalStructDecoder struct {
  44. typ reflect.Type
  45. fields map[string]*structFieldDecoder
  46. }
  47. func (decoder *generalStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  48. for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  49. fieldDecoder := decoder.fields[field]
  50. if fieldDecoder == nil {
  51. iter.Skip()
  52. } else {
  53. fieldDecoder.decode(ptr, iter)
  54. }
  55. }
  56. if iter.Error != nil && iter.Error != io.EOF {
  57. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  58. }
  59. }
  60. type skipDecoder struct {
  61. typ reflect.Type
  62. }
  63. func (decoder *skipDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  64. iter.Skip()
  65. if iter.Error != nil && iter.Error != io.EOF {
  66. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  67. }
  68. }
  69. type oneFieldStructDecoder struct {
  70. typ reflect.Type
  71. fieldName string
  72. fieldDecoder *structFieldDecoder
  73. }
  74. func (decoder *oneFieldStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  75. if !iter.readObjectStart() {
  76. return
  77. }
  78. field := iter.readObjectField()
  79. if field == decoder.fieldName {
  80. decoder.fieldDecoder.decode(ptr, iter)
  81. } else {
  82. iter.Skip()
  83. }
  84. for iter.nextToken() == ',' {
  85. field = iter.readObjectField()
  86. if field == decoder.fieldName {
  87. decoder.fieldDecoder.decode(ptr, iter)
  88. } else {
  89. iter.Skip()
  90. }
  91. }
  92. if iter.Error != nil && iter.Error != io.EOF {
  93. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  94. }
  95. }
  96. type twoFieldsStructDecoder struct {
  97. typ reflect.Type
  98. fieldName1 string
  99. fieldDecoder1 *structFieldDecoder
  100. fieldName2 string
  101. fieldDecoder2 *structFieldDecoder
  102. }
  103. func (decoder *twoFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  104. if !iter.readObjectStart() {
  105. return
  106. }
  107. field := iter.readObjectField()
  108. switch field {
  109. case decoder.fieldName1:
  110. decoder.fieldDecoder1.decode(ptr, iter)
  111. case decoder.fieldName2:
  112. decoder.fieldDecoder2.decode(ptr, iter)
  113. default:
  114. iter.Skip()
  115. }
  116. for iter.nextToken() == ',' {
  117. field = iter.readObjectField()
  118. switch field {
  119. case decoder.fieldName1:
  120. decoder.fieldDecoder1.decode(ptr, iter)
  121. case decoder.fieldName2:
  122. decoder.fieldDecoder2.decode(ptr, iter)
  123. default:
  124. iter.Skip()
  125. }
  126. }
  127. if iter.Error != nil && iter.Error != io.EOF {
  128. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  129. }
  130. }
  131. type threeFieldsStructDecoder struct {
  132. typ reflect.Type
  133. fieldName1 string
  134. fieldDecoder1 *structFieldDecoder
  135. fieldName2 string
  136. fieldDecoder2 *structFieldDecoder
  137. fieldName3 string
  138. fieldDecoder3 *structFieldDecoder
  139. }
  140. func (decoder *threeFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  141. if !iter.readObjectStart() {
  142. return
  143. }
  144. field := iter.readObjectField()
  145. switch field {
  146. case decoder.fieldName1:
  147. decoder.fieldDecoder1.decode(ptr, iter)
  148. case decoder.fieldName2:
  149. decoder.fieldDecoder2.decode(ptr, iter)
  150. case decoder.fieldName3:
  151. decoder.fieldDecoder3.decode(ptr, iter)
  152. default:
  153. iter.Skip()
  154. }
  155. for iter.nextToken() == ',' {
  156. field = iter.readObjectField()
  157. switch field {
  158. case decoder.fieldName1:
  159. decoder.fieldDecoder1.decode(ptr, iter)
  160. case decoder.fieldName2:
  161. decoder.fieldDecoder2.decode(ptr, iter)
  162. case decoder.fieldName3:
  163. decoder.fieldDecoder3.decode(ptr, iter)
  164. default:
  165. iter.Skip()
  166. }
  167. }
  168. if iter.Error != nil && iter.Error != io.EOF {
  169. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  170. }
  171. }
  172. type fourFieldsStructDecoder struct {
  173. typ reflect.Type
  174. fieldName1 string
  175. fieldDecoder1 *structFieldDecoder
  176. fieldName2 string
  177. fieldDecoder2 *structFieldDecoder
  178. fieldName3 string
  179. fieldDecoder3 *structFieldDecoder
  180. fieldName4 string
  181. fieldDecoder4 *structFieldDecoder
  182. }
  183. func (decoder *fourFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  184. if !iter.readObjectStart() {
  185. return
  186. }
  187. field := iter.readObjectField()
  188. switch field {
  189. case decoder.fieldName1:
  190. decoder.fieldDecoder1.decode(ptr, iter)
  191. case decoder.fieldName2:
  192. decoder.fieldDecoder2.decode(ptr, iter)
  193. case decoder.fieldName3:
  194. decoder.fieldDecoder3.decode(ptr, iter)
  195. case decoder.fieldName4:
  196. decoder.fieldDecoder4.decode(ptr, iter)
  197. default:
  198. iter.Skip()
  199. }
  200. for iter.nextToken() == ',' {
  201. field = iter.readObjectField()
  202. switch field {
  203. case decoder.fieldName1:
  204. decoder.fieldDecoder1.decode(ptr, iter)
  205. case decoder.fieldName2:
  206. decoder.fieldDecoder2.decode(ptr, iter)
  207. case decoder.fieldName3:
  208. decoder.fieldDecoder3.decode(ptr, iter)
  209. case decoder.fieldName4:
  210. decoder.fieldDecoder4.decode(ptr, iter)
  211. default:
  212. iter.Skip()
  213. }
  214. }
  215. if iter.Error != nil && iter.Error != io.EOF {
  216. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  217. }
  218. }
  219. type structFieldDecoder struct {
  220. field *reflect.StructField
  221. fieldDecoder Decoder
  222. }
  223. func (decoder *structFieldDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  224. fieldPtr := uintptr(ptr) + decoder.field.Offset
  225. decoder.fieldDecoder.decode(unsafe.Pointer(fieldPtr), iter)
  226. if iter.Error != nil && iter.Error != io.EOF {
  227. iter.Error = fmt.Errorf("%s: %s", decoder.field.Name, iter.Error.Error())
  228. }
  229. }
  230. type mapDecoder struct {
  231. mapType reflect.Type
  232. elemType reflect.Type
  233. elemDecoder Decoder
  234. mapInterface emptyInterface
  235. }
  236. func (decoder *mapDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  237. // dark magic to cast unsafe.Pointer back to interface{} using reflect.Type
  238. mapInterface := decoder.mapInterface
  239. mapInterface.word = ptr
  240. realInterface := (*interface{})(unsafe.Pointer(&mapInterface))
  241. realVal := reflect.ValueOf(*realInterface).Elem()
  242. for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  243. elem := reflect.New(decoder.elemType)
  244. decoder.elemDecoder.decode(unsafe.Pointer(elem.Pointer()), iter)
  245. // to put into map, we have to use reflection
  246. realVal.SetMapIndex(reflect.ValueOf(string([]byte(field))), elem.Elem())
  247. }
  248. }
  249. type sliceDecoder struct {
  250. sliceType reflect.Type
  251. elemType reflect.Type
  252. elemDecoder Decoder
  253. }
  254. // sliceHeader is a safe version of SliceHeader used within this package.
  255. type sliceHeader struct {
  256. Data unsafe.Pointer
  257. Len int
  258. Cap int
  259. }
  260. func (decoder *sliceDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  261. decoder.doDecode(ptr, iter)
  262. if iter.Error != nil && iter.Error != io.EOF {
  263. iter.Error = fmt.Errorf("%v: %s", decoder.sliceType, iter.Error.Error())
  264. }
  265. }
  266. func (decoder *sliceDecoder) doDecode(ptr unsafe.Pointer, iter *Iterator) {
  267. slice := (*sliceHeader)(ptr)
  268. reuseSlice(slice, decoder.sliceType, 4)
  269. if !iter.ReadArray() {
  270. return
  271. }
  272. offset := uintptr(0)
  273. decoder.elemDecoder.decode(unsafe.Pointer(uintptr(slice.Data) + offset), iter)
  274. if !iter.ReadArray() {
  275. slice.Len = 1
  276. return
  277. }
  278. offset += decoder.elemType.Size()
  279. decoder.elemDecoder.decode(unsafe.Pointer(uintptr(slice.Data) + offset), iter)
  280. if !iter.ReadArray() {
  281. slice.Len = 2
  282. return
  283. }
  284. offset += decoder.elemType.Size()
  285. decoder.elemDecoder.decode(unsafe.Pointer(uintptr(slice.Data) + offset), iter)
  286. if !iter.ReadArray() {
  287. slice.Len = 3
  288. return
  289. }
  290. offset += decoder.elemType.Size()
  291. decoder.elemDecoder.decode(unsafe.Pointer(uintptr(slice.Data) + offset), iter)
  292. slice.Len = 4
  293. for iter.ReadArray() {
  294. growOne(slice, decoder.sliceType, decoder.elemType)
  295. offset += decoder.elemType.Size()
  296. decoder.elemDecoder.decode(unsafe.Pointer(uintptr(slice.Data) + offset), iter)
  297. }
  298. }
  299. // grow grows the slice s so that it can hold extra more values, allocating
  300. // more capacity if needed. It also returns the old and new slice lengths.
  301. func growOne(slice *sliceHeader, sliceType reflect.Type, elementType reflect.Type) {
  302. newLen := slice.Len + 1
  303. if newLen <= slice.Cap {
  304. slice.Len = newLen
  305. return
  306. }
  307. newCap := slice.Cap
  308. if newCap == 0 {
  309. newCap = 1
  310. } else {
  311. for newCap < newLen {
  312. if slice.Len < 1024 {
  313. newCap += newCap
  314. } else {
  315. newCap += newCap / 4
  316. }
  317. }
  318. }
  319. dst := unsafe.Pointer(reflect.MakeSlice(sliceType, newLen, newCap).Pointer())
  320. // copy old array into new array
  321. originalBytesCount := uintptr(slice.Len) * elementType.Size()
  322. srcPtr := (*[1 << 30]byte)(slice.Data)
  323. dstPtr := (*[1 << 30]byte)(dst)
  324. for i := uintptr(0); i < originalBytesCount; i++ {
  325. dstPtr[i] = srcPtr[i]
  326. }
  327. slice.Len = newLen
  328. slice.Cap = newCap
  329. slice.Data = dst
  330. }
  331. func reuseSlice(slice *sliceHeader, sliceType reflect.Type, expectedCap int) {
  332. if expectedCap <= slice.Cap {
  333. return
  334. }
  335. dst := unsafe.Pointer(reflect.MakeSlice(sliceType, 0, expectedCap).Pointer())
  336. slice.Cap = expectedCap
  337. slice.Data = dst
  338. }
  339. var DECODERS unsafe.Pointer
  340. func addDecoderToCache(cacheKey reflect.Type, decoder Decoder) {
  341. retry := true
  342. for retry {
  343. ptr := atomic.LoadPointer(&DECODERS)
  344. cache := *(*map[reflect.Type]Decoder)(ptr)
  345. copy := map[reflect.Type]Decoder{}
  346. for k, v := range cache {
  347. copy[k] = v
  348. }
  349. copy[cacheKey] = decoder
  350. retry = !atomic.CompareAndSwapPointer(&DECODERS, ptr, unsafe.Pointer(&copy))
  351. }
  352. }
  353. func getDecoderFromCache(cacheKey reflect.Type) Decoder {
  354. ptr := atomic.LoadPointer(&DECODERS)
  355. cache := *(*map[reflect.Type]Decoder)(ptr)
  356. return cache[cacheKey]
  357. }
  358. var typeDecoders map[string]Decoder
  359. var fieldDecoders map[string]Decoder
  360. var extensions []ExtensionFunc
  361. func init() {
  362. typeDecoders = map[string]Decoder{}
  363. fieldDecoders = map[string]Decoder{}
  364. extensions = []ExtensionFunc{}
  365. atomic.StorePointer(&DECODERS, unsafe.Pointer(&map[string]Decoder{}))
  366. }
  367. type DecoderFunc func(ptr unsafe.Pointer, iter *Iterator)
  368. type ExtensionFunc func(typ reflect.Type, field *reflect.StructField) ([]string, DecoderFunc)
  369. type funcDecoder struct {
  370. fun DecoderFunc
  371. }
  372. func (decoder *funcDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  373. decoder.fun(ptr, iter)
  374. }
  375. // RegisterTypeDecoder can register a type for json object
  376. func RegisterTypeDecoder(typ string, fun DecoderFunc) {
  377. typeDecoders[typ] = &funcDecoder{fun}
  378. }
  379. // RegisterFieldDecoder can register a type for json field
  380. func RegisterFieldDecoder(typ string, field string, fun DecoderFunc) {
  381. fieldDecoders[fmt.Sprintf("%s/%s", typ, field)] = &funcDecoder{fun}
  382. }
  383. // RegisterExtension can register a custom extension
  384. func RegisterExtension(extension ExtensionFunc) {
  385. extensions = append(extensions, extension)
  386. }
  387. // CleanDecoders cleans decoders registered
  388. func CleanDecoders() {
  389. typeDecoders = map[string]Decoder{}
  390. fieldDecoders = map[string]Decoder{}
  391. }
  392. // emptyInterface is the header for an interface{} value.
  393. type emptyInterface struct {
  394. typ *struct{}
  395. word unsafe.Pointer
  396. }
  397. // ReadAny converts a json object in a Iterator instance to Any
  398. func (iter *Iterator) ReadAny() (ret *Any) {
  399. valueType := iter.WhatIsNext()
  400. switch valueType {
  401. case String:
  402. return MakeAny(iter.ReadString())
  403. case Number:
  404. return iter.readNumber()
  405. case Null:
  406. return MakeAny(nil)
  407. case Bool:
  408. return MakeAny(iter.ReadBool())
  409. case Array:
  410. val := []interface{}{}
  411. for iter.ReadArray() {
  412. element := iter.ReadAny()
  413. if iter.Error != nil {
  414. return
  415. }
  416. val = append(val, element.val)
  417. }
  418. return MakeAny(val)
  419. case Object:
  420. val := map[string]interface{}{}
  421. for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  422. element := iter.ReadAny()
  423. if iter.Error != nil {
  424. return
  425. }
  426. val[string([]byte(field))] = element.val
  427. }
  428. return MakeAny(val)
  429. default:
  430. iter.reportError("ReadAny", fmt.Sprintf("unexpected value type: %v", valueType))
  431. return MakeAny(nil)
  432. }
  433. }
  434. func (iter *Iterator) readNumber() (ret *Any) {
  435. strBuf := [8]byte{}
  436. str := strBuf[0:0]
  437. hasMore := true
  438. foundFloat := false
  439. foundNegative := false
  440. for hasMore {
  441. for i := iter.head; i < iter.tail; i++ {
  442. c := iter.buf[i]
  443. switch c {
  444. case '-':
  445. foundNegative = true
  446. str = append(str, c)
  447. continue
  448. case '+', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
  449. str = append(str, c)
  450. continue
  451. case '.', 'e', 'E':
  452. foundFloat = true
  453. str = append(str, c)
  454. continue
  455. default:
  456. iter.head = i
  457. hasMore = false
  458. break
  459. }
  460. if !hasMore {
  461. break
  462. }
  463. }
  464. if hasMore {
  465. if !iter.loadMore() {
  466. break
  467. }
  468. }
  469. }
  470. if iter.Error != nil && iter.Error != io.EOF {
  471. return
  472. }
  473. number := *(*string)(unsafe.Pointer(&str))
  474. if foundFloat {
  475. val, err := strconv.ParseFloat(number, 64)
  476. if err != nil {
  477. iter.Error = err
  478. return
  479. }
  480. return MakeAny(val)
  481. }
  482. if foundNegative {
  483. val, err := strconv.ParseInt(number, 10, 64)
  484. if err != nil {
  485. iter.Error = err
  486. return
  487. }
  488. return MakeAny(val)
  489. }
  490. val, err := strconv.ParseUint(number, 10, 64)
  491. if err != nil {
  492. iter.Error = err
  493. return
  494. }
  495. return MakeAny(val)
  496. }
  497. // Read converts an Iterator instance into go interface, same as json.Unmarshal
  498. func (iter *Iterator) Read(obj interface{}) {
  499. typ := reflect.TypeOf(obj)
  500. cacheKey := typ.Elem()
  501. cachedDecoder := getDecoderFromCache(cacheKey)
  502. if cachedDecoder == nil {
  503. decoder, err := decoderOfType(typ)
  504. if err != nil {
  505. iter.Error = err
  506. return
  507. }
  508. cachedDecoder = decoder
  509. addDecoderToCache(cacheKey, decoder)
  510. }
  511. e := (*emptyInterface)(unsafe.Pointer(&obj))
  512. cachedDecoder.decode(e.word, iter)
  513. }
  514. type prefix string
  515. func (p prefix) addTo(decoder Decoder, err error) (Decoder, error) {
  516. if err != nil {
  517. return nil, fmt.Errorf("%s: %s", p, err.Error())
  518. }
  519. return decoder, err
  520. }
  521. func decoderOfType(typ reflect.Type) (Decoder, error) {
  522. switch typ.Kind() {
  523. case reflect.Ptr:
  524. return prefix("ptr").addTo(decoderOfPtr(typ.Elem()))
  525. default:
  526. return nil, errors.New("expect ptr")
  527. }
  528. }
  529. func decoderOfPtr(typ reflect.Type) (Decoder, error) {
  530. typeName := typ.String()
  531. if typeName == "jsoniter.Any" {
  532. return &anyDecoder{}, nil
  533. }
  534. typeDecoder := typeDecoders[typeName]
  535. if typeDecoder != nil {
  536. return typeDecoder, nil
  537. }
  538. switch typ.Kind() {
  539. case reflect.String:
  540. return &stringDecoder{}, nil
  541. case reflect.Int:
  542. return &intDecoder{}, nil
  543. case reflect.Int8:
  544. return &int8Decoder{}, nil
  545. case reflect.Int16:
  546. return &int16Decoder{}, nil
  547. case reflect.Int32:
  548. return &int32Decoder{}, nil
  549. case reflect.Int64:
  550. return &int64Decoder{}, nil
  551. case reflect.Uint:
  552. return &uintDecoder{}, nil
  553. case reflect.Uint8:
  554. return &uint8Decoder{}, nil
  555. case reflect.Uint16:
  556. return &uint16Decoder{}, nil
  557. case reflect.Uint32:
  558. return &uint32Decoder{}, nil
  559. case reflect.Uint64:
  560. return &uint64Decoder{}, nil
  561. case reflect.Float32:
  562. return &float32Decoder{}, nil
  563. case reflect.Float64:
  564. return &float64Decoder{}, nil
  565. case reflect.Bool:
  566. return &boolDecoder{}, nil
  567. case reflect.Interface:
  568. return &interfaceDecoder{}, nil
  569. case reflect.Struct:
  570. return decoderOfStruct(typ)
  571. case reflect.Slice:
  572. return prefix("[slice]").addTo(decoderOfSlice(typ))
  573. case reflect.Map:
  574. return prefix("[map]").addTo(decoderOfMap(typ))
  575. case reflect.Ptr:
  576. return prefix("[optional]").addTo(decoderOfOptional(typ.Elem()))
  577. default:
  578. return nil, fmt.Errorf("unsupported type: %v", typ)
  579. }
  580. }
  581. func decoderOfOptional(typ reflect.Type) (Decoder, error) {
  582. decoder, err := decoderOfPtr(typ)
  583. if err != nil {
  584. return nil, err
  585. }
  586. return &optionalDecoder{typ, decoder}, nil
  587. }
  588. func decoderOfStruct(typ reflect.Type) (Decoder, error) {
  589. fields := map[string]*structFieldDecoder{}
  590. for i := 0; i < typ.NumField(); i++ {
  591. field := typ.Field(i)
  592. fieldDecoderKey := fmt.Sprintf("%s/%s", typ.String(), field.Name)
  593. var fieldNames []string
  594. for _, extension := range extensions {
  595. alternativeFieldNames, fun := extension(typ, &field)
  596. if alternativeFieldNames != nil {
  597. fieldNames = alternativeFieldNames
  598. }
  599. if fun != nil {
  600. fieldDecoders[fieldDecoderKey] = &funcDecoder{fun}
  601. }
  602. }
  603. decoder := fieldDecoders[fieldDecoderKey]
  604. tagParts := strings.Split(field.Tag.Get("json"), ",")
  605. // if fieldNames set by extension, use theirs, otherwise try tags
  606. if fieldNames == nil {
  607. /// tagParts[0] always present, even if no tags
  608. switch tagParts[0] {
  609. case "":
  610. fieldNames = []string{field.Name}
  611. case "-":
  612. fieldNames = []string{}
  613. default:
  614. fieldNames = []string{tagParts[0]}
  615. }
  616. }
  617. if decoder == nil {
  618. var err error
  619. decoder, err = decoderOfPtr(field.Type)
  620. if err != nil {
  621. return prefix(fmt.Sprintf("{%s}", field.Name)).addTo(decoder, err)
  622. }
  623. }
  624. if len(tagParts) > 1 && tagParts[1] == "string" {
  625. decoder = &stringNumberDecoder{decoder}
  626. }
  627. for _, fieldName := range fieldNames {
  628. fields[fieldName] = &structFieldDecoder{&field, decoder}
  629. }
  630. }
  631. switch len(fields) {
  632. case 0:
  633. return &skipDecoder{typ}, nil
  634. case 1:
  635. for fieldName, fieldDecoder := range fields {
  636. return &oneFieldStructDecoder{typ, fieldName, fieldDecoder}, nil
  637. }
  638. case 2:
  639. var fieldName1 string
  640. var fieldName2 string
  641. var fieldDecoder1 *structFieldDecoder
  642. var fieldDecoder2 *structFieldDecoder
  643. for fieldName, fieldDecoder := range fields {
  644. if fieldName1 == "" {
  645. fieldName1 = fieldName
  646. fieldDecoder1 = fieldDecoder
  647. } else {
  648. fieldName2 = fieldName
  649. fieldDecoder2 = fieldDecoder
  650. }
  651. }
  652. return &twoFieldsStructDecoder{typ, fieldName1, fieldDecoder1, fieldName2, fieldDecoder2}, nil
  653. case 3:
  654. var fieldName1 string
  655. var fieldName2 string
  656. var fieldName3 string
  657. var fieldDecoder1 *structFieldDecoder
  658. var fieldDecoder2 *structFieldDecoder
  659. var fieldDecoder3 *structFieldDecoder
  660. for fieldName, fieldDecoder := range fields {
  661. if fieldName1 == "" {
  662. fieldName1 = fieldName
  663. fieldDecoder1 = fieldDecoder
  664. } else if fieldName2 == "" {
  665. fieldName2 = fieldName
  666. fieldDecoder2 = fieldDecoder
  667. } else {
  668. fieldName3 = fieldName
  669. fieldDecoder3 = fieldDecoder
  670. }
  671. }
  672. return &threeFieldsStructDecoder{typ,
  673. fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3}, nil
  674. case 4:
  675. var fieldName1 string
  676. var fieldName2 string
  677. var fieldName3 string
  678. var fieldName4 string
  679. var fieldDecoder1 *structFieldDecoder
  680. var fieldDecoder2 *structFieldDecoder
  681. var fieldDecoder3 *structFieldDecoder
  682. var fieldDecoder4 *structFieldDecoder
  683. for fieldName, fieldDecoder := range fields {
  684. if fieldName1 == "" {
  685. fieldName1 = fieldName
  686. fieldDecoder1 = fieldDecoder
  687. } else if fieldName2 == "" {
  688. fieldName2 = fieldName
  689. fieldDecoder2 = fieldDecoder
  690. } else if fieldName3 == "" {
  691. fieldName3 = fieldName
  692. fieldDecoder3 = fieldDecoder
  693. } else {
  694. fieldName4 = fieldName
  695. fieldDecoder4 = fieldDecoder
  696. }
  697. }
  698. return &fourFieldsStructDecoder{typ,
  699. fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
  700. fieldName4, fieldDecoder4}, nil
  701. }
  702. return &generalStructDecoder{typ, fields}, nil
  703. }
  704. func decoderOfSlice(typ reflect.Type) (Decoder, error) {
  705. decoder, err := decoderOfPtr(typ.Elem())
  706. if err != nil {
  707. return nil, err
  708. }
  709. return &sliceDecoder{typ, typ.Elem(), decoder}, nil
  710. }
  711. func decoderOfMap(typ reflect.Type) (Decoder, error) {
  712. decoder, err := decoderOfPtr(typ.Elem())
  713. if err != nil {
  714. return nil, err
  715. }
  716. mapInterface := reflect.New(typ).Interface()
  717. return &mapDecoder{typ, typ.Elem(), decoder, *((*emptyInterface)(unsafe.Pointer(&mapInterface)))}, nil
  718. }