feature_reflect.go 20 KB

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