12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142 |
- package jsoniter
- import (
- "fmt"
- "io"
- "reflect"
- "strings"
- "unicode"
- "unsafe"
- )
- func encoderOfStruct(typ reflect.Type) (Encoder, error) {
- structEncoder_ := &structEncoder{}
- fields := map[string]*structFieldEncoder{}
- for _, field := range listStructFields(typ) {
- fieldEncoderKey := fmt.Sprintf("%s/%s", typ.String(), field.Name)
- var extensionProvidedFieldNames []string
- for _, extension := range extensions {
- alternativeFieldNames, fun, _ := extension(typ, field)
- if alternativeFieldNames != nil {
- extensionProvidedFieldNames = alternativeFieldNames
- }
- if fun != nil {
- fieldEncoders[fieldEncoderKey] = &funcEncoder{fun}
- }
- }
- tagParts := strings.Split(field.Tag.Get("json"), ",")
- // if fieldNames set by extension, use theirs, otherwise try tags
- fieldNames := calcFieldNames(field.Name, tagParts[0], extensionProvidedFieldNames)
- omitempty := false
- for _, tagPart := range tagParts {
- if tagPart == "omitempty" {
- omitempty = true
- }
- }
- encoder := fieldEncoders[fieldEncoderKey]
- var err error
- if encoder == nil && len(fieldNames) > 0 {
- encoder, err = encoderOfType(field.Type)
- if err != nil {
- return prefix(fmt.Sprintf("{%s}", field.Name)).addToEncoder(encoder, err)
- }
- // map is stored as pointer in the struct
- if field.Type.Kind() == reflect.Map {
- encoder = &optionalEncoder{encoder}
- }
- }
- for _, fieldName := range fieldNames {
- fields[fieldName] = &structFieldEncoder{field, fieldName, encoder, omitempty}
- }
- }
- if len(fields) == 0 {
- return &emptyStructEncoder{}, nil
- }
- for _, field := range fields {
- structEncoder_.fields = append(structEncoder_.fields, field)
- }
- return structEncoder_, nil
- }
- func listStructFields(typ reflect.Type) []*reflect.StructField {
- fields := []*reflect.StructField{}
- for i := 0; i < typ.NumField(); i++ {
- field := typ.Field(i)
- if field.Anonymous {
- fields = append(fields, listStructFields(field.Type)...)
- } else {
- fields = append(fields, &field)
- }
- }
- return fields
- }
- func decoderOfStruct(typ reflect.Type) (Decoder, error) {
- fields := map[string]*structFieldDecoder{}
- for i := 0; i < typ.NumField(); i++ {
- field := typ.Field(i)
- fieldDecoderKey := fmt.Sprintf("%s/%s", typ.String(), field.Name)
- var extensionProviedFieldNames []string
- for _, extension := range extensions {
- alternativeFieldNames, _, fun := extension(typ, &field)
- if alternativeFieldNames != nil {
- extensionProviedFieldNames = alternativeFieldNames
- }
- if fun != nil {
- fieldDecoders[fieldDecoderKey] = &funcDecoder{fun}
- }
- }
- decoder := fieldDecoders[fieldDecoderKey]
- tagParts := strings.Split(field.Tag.Get("json"), ",")
- fieldNames := calcFieldNames(field.Name, tagParts[0], extensionProviedFieldNames)
- if decoder == nil && len(fieldNames) > 0 {
- var err error
- decoder, err = decoderOfType(field.Type)
- if err != nil {
- return prefix(fmt.Sprintf("{%s}", field.Name)).addToDecoder(decoder, err)
- }
- }
- if len(tagParts) > 1 && tagParts[1] == "string" {
- decoder = &stringNumberDecoder{decoder}
- }
- for _, fieldName := range fieldNames {
- fields[fieldName] = &structFieldDecoder{&field, decoder}
- }
- }
- return createStructDecoder(typ, fields)
- }
- func calcFieldNames(originalFieldName string, tagProvidedFieldName string, extensionProvidedFieldNames []string) []string {
- // tag => extension => exported? => original
- isNotExported := unicode.IsLower(rune(originalFieldName[0]))
- var fieldNames []string
- /// tagParts[0] always present, even if no tags
- switch tagProvidedFieldName {
- case "":
- if extensionProvidedFieldNames != nil {
- fieldNames = extensionProvidedFieldNames
- } else {
- if isNotExported {
- fieldNames = []string{}
- } else {
- fieldNames = []string{originalFieldName}
- }
- }
- case "-":
- fieldNames = []string{}
- default:
- fieldNames = []string{tagProvidedFieldName}
- }
- return fieldNames
- }
- func EnableUnexportedStructFieldsSupport() {
- RegisterExtension(func(type_ reflect.Type, field *reflect.StructField) ([]string, EncoderFunc, DecoderFunc) {
- return []string{field.Name}, nil, nil
- })
- }
- func createStructDecoder(typ reflect.Type, fields map[string]*structFieldDecoder) (Decoder, error) {
- knownHash := map[int32]struct{}{
- 0: {},
- }
- switch len(fields) {
- case 0:
- return &skipDecoder{typ}, nil
- case 1:
- for fieldName, fieldDecoder := range fields {
- fieldHash := calcHash(fieldName)
- _, known := knownHash[fieldHash]
- if known {
- return &generalStructDecoder{typ, fields}, nil
- } else {
- knownHash[fieldHash] = struct{}{}
- }
- return &oneFieldStructDecoder{typ, fieldHash, fieldDecoder}, nil
- }
- case 2:
- var fieldHash1 int32
- var fieldHash2 int32
- var fieldDecoder1 *structFieldDecoder
- var fieldDecoder2 *structFieldDecoder
- for fieldName, fieldDecoder := range fields {
- fieldHash := calcHash(fieldName)
- _, known := knownHash[fieldHash]
- if known {
- return &generalStructDecoder{typ, fields}, nil
- } else {
- knownHash[fieldHash] = struct{}{}
- }
- if fieldHash1 == 0 {
- fieldHash1 = fieldHash
- fieldDecoder1 = fieldDecoder
- } else {
- fieldHash2 = fieldHash
- fieldDecoder2 = fieldDecoder
- }
- }
- return &twoFieldsStructDecoder{typ, fieldHash1, fieldDecoder1, fieldHash2, fieldDecoder2}, nil
- case 3:
- var fieldName1 int32
- var fieldName2 int32
- var fieldName3 int32
- var fieldDecoder1 *structFieldDecoder
- var fieldDecoder2 *structFieldDecoder
- var fieldDecoder3 *structFieldDecoder
- for fieldName, fieldDecoder := range fields {
- fieldHash := calcHash(fieldName)
- _, known := knownHash[fieldHash]
- if known {
- return &generalStructDecoder{typ, fields}, nil
- } else {
- knownHash[fieldHash] = struct{}{}
- }
- if fieldName1 == 0 {
- fieldName1 = fieldHash
- fieldDecoder1 = fieldDecoder
- } else if fieldName2 == 0 {
- fieldName2 = fieldHash
- fieldDecoder2 = fieldDecoder
- } else {
- fieldName3 = fieldHash
- fieldDecoder3 = fieldDecoder
- }
- }
- return &threeFieldsStructDecoder{typ,
- fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3}, nil
- case 4:
- var fieldName1 int32
- var fieldName2 int32
- var fieldName3 int32
- var fieldName4 int32
- var fieldDecoder1 *structFieldDecoder
- var fieldDecoder2 *structFieldDecoder
- var fieldDecoder3 *structFieldDecoder
- var fieldDecoder4 *structFieldDecoder
- for fieldName, fieldDecoder := range fields {
- fieldHash := calcHash(fieldName)
- _, known := knownHash[fieldHash]
- if known {
- return &generalStructDecoder{typ, fields}, nil
- } else {
- knownHash[fieldHash] = struct{}{}
- }
- if fieldName1 == 0 {
- fieldName1 = fieldHash
- fieldDecoder1 = fieldDecoder
- } else if fieldName2 == 0 {
- fieldName2 = fieldHash
- fieldDecoder2 = fieldDecoder
- } else if fieldName3 == 0 {
- fieldName3 = fieldHash
- fieldDecoder3 = fieldDecoder
- } else {
- fieldName4 = fieldHash
- fieldDecoder4 = fieldDecoder
- }
- }
- return &fourFieldsStructDecoder{typ,
- fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
- fieldName4, fieldDecoder4}, nil
- case 5:
- var fieldName1 int32
- var fieldName2 int32
- var fieldName3 int32
- var fieldName4 int32
- var fieldName5 int32
- var fieldDecoder1 *structFieldDecoder
- var fieldDecoder2 *structFieldDecoder
- var fieldDecoder3 *structFieldDecoder
- var fieldDecoder4 *structFieldDecoder
- var fieldDecoder5 *structFieldDecoder
- for fieldName, fieldDecoder := range fields {
- fieldHash := calcHash(fieldName)
- _, known := knownHash[fieldHash]
- if known {
- return &generalStructDecoder{typ, fields}, nil
- } else {
- knownHash[fieldHash] = struct{}{}
- }
- if fieldName1 == 0 {
- fieldName1 = fieldHash
- fieldDecoder1 = fieldDecoder
- } else if fieldName2 == 0 {
- fieldName2 = fieldHash
- fieldDecoder2 = fieldDecoder
- } else if fieldName3 == 0 {
- fieldName3 = fieldHash
- fieldDecoder3 = fieldDecoder
- } else if fieldName4 == 0 {
- fieldName4 = fieldHash
- fieldDecoder4 = fieldDecoder
- } else {
- fieldName5 = fieldHash
- fieldDecoder5 = fieldDecoder
- }
- }
- return &fiveFieldsStructDecoder{typ,
- fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
- fieldName4, fieldDecoder4, fieldName5, fieldDecoder5}, nil
- case 6:
- var fieldName1 int32
- var fieldName2 int32
- var fieldName3 int32
- var fieldName4 int32
- var fieldName5 int32
- var fieldName6 int32
- var fieldDecoder1 *structFieldDecoder
- var fieldDecoder2 *structFieldDecoder
- var fieldDecoder3 *structFieldDecoder
- var fieldDecoder4 *structFieldDecoder
- var fieldDecoder5 *structFieldDecoder
- var fieldDecoder6 *structFieldDecoder
- for fieldName, fieldDecoder := range fields {
- fieldHash := calcHash(fieldName)
- _, known := knownHash[fieldHash]
- if known {
- return &generalStructDecoder{typ, fields}, nil
- } else {
- knownHash[fieldHash] = struct{}{}
- }
- if fieldName1 == 0 {
- fieldName1 = fieldHash
- fieldDecoder1 = fieldDecoder
- } else if fieldName2 == 0 {
- fieldName2 = fieldHash
- fieldDecoder2 = fieldDecoder
- } else if fieldName3 == 0 {
- fieldName3 = fieldHash
- fieldDecoder3 = fieldDecoder
- } else if fieldName4 == 0 {
- fieldName4 = fieldHash
- fieldDecoder4 = fieldDecoder
- } else if fieldName5 == 0 {
- fieldName5 = fieldHash
- fieldDecoder5 = fieldDecoder
- } else {
- fieldName6 = fieldHash
- fieldDecoder6 = fieldDecoder
- }
- }
- return &sixFieldsStructDecoder{typ,
- fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
- fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6}, nil
- case 7:
- var fieldName1 int32
- var fieldName2 int32
- var fieldName3 int32
- var fieldName4 int32
- var fieldName5 int32
- var fieldName6 int32
- var fieldName7 int32
- var fieldDecoder1 *structFieldDecoder
- var fieldDecoder2 *structFieldDecoder
- var fieldDecoder3 *structFieldDecoder
- var fieldDecoder4 *structFieldDecoder
- var fieldDecoder5 *structFieldDecoder
- var fieldDecoder6 *structFieldDecoder
- var fieldDecoder7 *structFieldDecoder
- for fieldName, fieldDecoder := range fields {
- fieldHash := calcHash(fieldName)
- _, known := knownHash[fieldHash]
- if known {
- return &generalStructDecoder{typ, fields}, nil
- } else {
- knownHash[fieldHash] = struct{}{}
- }
- if fieldName1 == 0 {
- fieldName1 = fieldHash
- fieldDecoder1 = fieldDecoder
- } else if fieldName2 == 0 {
- fieldName2 = fieldHash
- fieldDecoder2 = fieldDecoder
- } else if fieldName3 == 0 {
- fieldName3 = fieldHash
- fieldDecoder3 = fieldDecoder
- } else if fieldName4 == 0 {
- fieldName4 = fieldHash
- fieldDecoder4 = fieldDecoder
- } else if fieldName5 == 0 {
- fieldName5 = fieldHash
- fieldDecoder5 = fieldDecoder
- } else if fieldName6 == 0 {
- fieldName6 = fieldHash
- fieldDecoder6 = fieldDecoder
- } else {
- fieldName7 = fieldHash
- fieldDecoder7 = fieldDecoder
- }
- }
- return &sevenFieldsStructDecoder{typ,
- fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
- fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6,
- fieldName7, fieldDecoder7}, nil
- case 8:
- var fieldName1 int32
- var fieldName2 int32
- var fieldName3 int32
- var fieldName4 int32
- var fieldName5 int32
- var fieldName6 int32
- var fieldName7 int32
- var fieldName8 int32
- var fieldDecoder1 *structFieldDecoder
- var fieldDecoder2 *structFieldDecoder
- var fieldDecoder3 *structFieldDecoder
- var fieldDecoder4 *structFieldDecoder
- var fieldDecoder5 *structFieldDecoder
- var fieldDecoder6 *structFieldDecoder
- var fieldDecoder7 *structFieldDecoder
- var fieldDecoder8 *structFieldDecoder
- for fieldName, fieldDecoder := range fields {
- fieldHash := calcHash(fieldName)
- _, known := knownHash[fieldHash]
- if known {
- return &generalStructDecoder{typ, fields}, nil
- } else {
- knownHash[fieldHash] = struct{}{}
- }
- if fieldName1 == 0 {
- fieldName1 = fieldHash
- fieldDecoder1 = fieldDecoder
- } else if fieldName2 == 0 {
- fieldName2 = fieldHash
- fieldDecoder2 = fieldDecoder
- } else if fieldName3 == 0 {
- fieldName3 = fieldHash
- fieldDecoder3 = fieldDecoder
- } else if fieldName4 == 0 {
- fieldName4 = fieldHash
- fieldDecoder4 = fieldDecoder
- } else if fieldName5 == 0 {
- fieldName5 = fieldHash
- fieldDecoder5 = fieldDecoder
- } else if fieldName6 == 0 {
- fieldName6 = fieldHash
- fieldDecoder6 = fieldDecoder
- } else if fieldName7 == 0 {
- fieldName7 = fieldHash
- fieldDecoder7 = fieldDecoder
- } else {
- fieldName8 = fieldHash
- fieldDecoder8 = fieldDecoder
- }
- }
- return &eightFieldsStructDecoder{typ,
- fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
- fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6,
- fieldName7, fieldDecoder7, fieldName8, fieldDecoder8}, nil
- case 9:
- var fieldName1 int32
- var fieldName2 int32
- var fieldName3 int32
- var fieldName4 int32
- var fieldName5 int32
- var fieldName6 int32
- var fieldName7 int32
- var fieldName8 int32
- var fieldName9 int32
- var fieldDecoder1 *structFieldDecoder
- var fieldDecoder2 *structFieldDecoder
- var fieldDecoder3 *structFieldDecoder
- var fieldDecoder4 *structFieldDecoder
- var fieldDecoder5 *structFieldDecoder
- var fieldDecoder6 *structFieldDecoder
- var fieldDecoder7 *structFieldDecoder
- var fieldDecoder8 *structFieldDecoder
- var fieldDecoder9 *structFieldDecoder
- for fieldName, fieldDecoder := range fields {
- fieldHash := calcHash(fieldName)
- _, known := knownHash[fieldHash]
- if known {
- return &generalStructDecoder{typ, fields}, nil
- } else {
- knownHash[fieldHash] = struct{}{}
- }
- if fieldName1 == 0 {
- fieldName1 = fieldHash
- fieldDecoder1 = fieldDecoder
- } else if fieldName2 == 0 {
- fieldName2 = fieldHash
- fieldDecoder2 = fieldDecoder
- } else if fieldName3 == 0 {
- fieldName3 = fieldHash
- fieldDecoder3 = fieldDecoder
- } else if fieldName4 == 0 {
- fieldName4 = fieldHash
- fieldDecoder4 = fieldDecoder
- } else if fieldName5 == 0 {
- fieldName5 = fieldHash
- fieldDecoder5 = fieldDecoder
- } else if fieldName6 == 0 {
- fieldName6 = fieldHash
- fieldDecoder6 = fieldDecoder
- } else if fieldName7 == 0 {
- fieldName7 = fieldHash
- fieldDecoder7 = fieldDecoder
- } else if fieldName8 == 0 {
- fieldName8 = fieldHash
- fieldDecoder8 = fieldDecoder
- } else {
- fieldName9 = fieldHash
- fieldDecoder9 = fieldDecoder
- }
- }
- return &nineFieldsStructDecoder{typ,
- fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
- fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6,
- fieldName7, fieldDecoder7, fieldName8, fieldDecoder8, fieldName9, fieldDecoder9}, nil
- case 10:
- var fieldName1 int32
- var fieldName2 int32
- var fieldName3 int32
- var fieldName4 int32
- var fieldName5 int32
- var fieldName6 int32
- var fieldName7 int32
- var fieldName8 int32
- var fieldName9 int32
- var fieldName10 int32
- var fieldDecoder1 *structFieldDecoder
- var fieldDecoder2 *structFieldDecoder
- var fieldDecoder3 *structFieldDecoder
- var fieldDecoder4 *structFieldDecoder
- var fieldDecoder5 *structFieldDecoder
- var fieldDecoder6 *structFieldDecoder
- var fieldDecoder7 *structFieldDecoder
- var fieldDecoder8 *structFieldDecoder
- var fieldDecoder9 *structFieldDecoder
- var fieldDecoder10 *structFieldDecoder
- for fieldName, fieldDecoder := range fields {
- fieldHash := calcHash(fieldName)
- _, known := knownHash[fieldHash]
- if known {
- return &generalStructDecoder{typ, fields}, nil
- } else {
- knownHash[fieldHash] = struct{}{}
- }
- if fieldName1 == 0 {
- fieldName1 = fieldHash
- fieldDecoder1 = fieldDecoder
- } else if fieldName2 == 0 {
- fieldName2 = fieldHash
- fieldDecoder2 = fieldDecoder
- } else if fieldName3 == 0 {
- fieldName3 = fieldHash
- fieldDecoder3 = fieldDecoder
- } else if fieldName4 == 0 {
- fieldName4 = fieldHash
- fieldDecoder4 = fieldDecoder
- } else if fieldName5 == 0 {
- fieldName5 = fieldHash
- fieldDecoder5 = fieldDecoder
- } else if fieldName6 == 0 {
- fieldName6 = fieldHash
- fieldDecoder6 = fieldDecoder
- } else if fieldName7 == 0 {
- fieldName7 = fieldHash
- fieldDecoder7 = fieldDecoder
- } else if fieldName8 == 0 {
- fieldName8 = fieldHash
- fieldDecoder8 = fieldDecoder
- } else if fieldName9 == 0 {
- fieldName9 = fieldHash
- fieldDecoder9 = fieldDecoder
- } else {
- fieldName10 = fieldHash
- fieldDecoder10 = fieldDecoder
- }
- }
- return &tenFieldsStructDecoder{typ,
- fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
- fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6,
- fieldName7, fieldDecoder7, fieldName8, fieldDecoder8, fieldName9, fieldDecoder9,
- fieldName10, fieldDecoder10}, nil
- }
- return &generalStructDecoder{typ, fields}, nil
- }
- type generalStructDecoder struct {
- typ reflect.Type
- fields map[string]*structFieldDecoder
- }
- func (decoder *generalStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
- if !iter.readObjectStart() {
- return
- }
- fieldBytes := iter.readObjectFieldAsBytes()
- field := *(*string)(unsafe.Pointer(&fieldBytes))
- fieldDecoder := decoder.fields[field]
- if fieldDecoder == nil {
- iter.Skip()
- } else {
- fieldDecoder.decode(ptr, iter)
- }
- for iter.nextToken() == ',' {
- fieldBytes = iter.readObjectFieldAsBytes()
- field = *(*string)(unsafe.Pointer(&fieldBytes))
- fieldDecoder = decoder.fields[field]
- if fieldDecoder == nil {
- iter.Skip()
- } else {
- fieldDecoder.decode(ptr, iter)
- }
- }
- if iter.Error != nil && iter.Error != io.EOF {
- iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
- }
- }
- type skipDecoder struct {
- typ reflect.Type
- }
- func (decoder *skipDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
- iter.Skip()
- if iter.Error != nil && iter.Error != io.EOF {
- iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
- }
- }
- type oneFieldStructDecoder struct {
- typ reflect.Type
- fieldHash int32
- fieldDecoder *structFieldDecoder
- }
- func (decoder *oneFieldStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
- if !iter.readObjectStart() {
- return
- }
- for {
- if iter.readFieldHash() == decoder.fieldHash {
- decoder.fieldDecoder.decode(ptr, iter)
- } else {
- iter.Skip()
- }
- if iter.nextToken() != ',' {
- break
- }
- }
- if iter.Error != nil && iter.Error != io.EOF {
- iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
- }
- }
- type twoFieldsStructDecoder struct {
- typ reflect.Type
- fieldHash1 int32
- fieldDecoder1 *structFieldDecoder
- fieldHash2 int32
- fieldDecoder2 *structFieldDecoder
- }
- func (decoder *twoFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
- if !iter.readObjectStart() {
- return
- }
- for {
- switch iter.readFieldHash() {
- case decoder.fieldHash1:
- decoder.fieldDecoder1.decode(ptr, iter)
- case decoder.fieldHash2:
- decoder.fieldDecoder2.decode(ptr, iter)
- default:
- iter.Skip()
- }
- if iter.nextToken() != ',' {
- break
- }
- }
- if iter.Error != nil && iter.Error != io.EOF {
- iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
- }
- }
- type threeFieldsStructDecoder struct {
- typ reflect.Type
- fieldHash1 int32
- fieldDecoder1 *structFieldDecoder
- fieldHash2 int32
- fieldDecoder2 *structFieldDecoder
- fieldHash3 int32
- fieldDecoder3 *structFieldDecoder
- }
- func (decoder *threeFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
- if !iter.readObjectStart() {
- return
- }
- for {
- switch iter.readFieldHash() {
- case decoder.fieldHash1:
- decoder.fieldDecoder1.decode(ptr, iter)
- case decoder.fieldHash2:
- decoder.fieldDecoder2.decode(ptr, iter)
- case decoder.fieldHash3:
- decoder.fieldDecoder3.decode(ptr, iter)
- default:
- iter.Skip()
- }
- if iter.nextToken() != ',' {
- break
- }
- }
- if iter.Error != nil && iter.Error != io.EOF {
- iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
- }
- }
- type fourFieldsStructDecoder struct {
- typ reflect.Type
- fieldHash1 int32
- fieldDecoder1 *structFieldDecoder
- fieldHash2 int32
- fieldDecoder2 *structFieldDecoder
- fieldHash3 int32
- fieldDecoder3 *structFieldDecoder
- fieldHash4 int32
- fieldDecoder4 *structFieldDecoder
- }
- func (decoder *fourFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
- if !iter.readObjectStart() {
- return
- }
- for {
- switch iter.readFieldHash() {
- case decoder.fieldHash1:
- decoder.fieldDecoder1.decode(ptr, iter)
- case decoder.fieldHash2:
- decoder.fieldDecoder2.decode(ptr, iter)
- case decoder.fieldHash3:
- decoder.fieldDecoder3.decode(ptr, iter)
- case decoder.fieldHash4:
- decoder.fieldDecoder4.decode(ptr, iter)
- default:
- iter.Skip()
- }
- if iter.nextToken() != ',' {
- break
- }
- }
- if iter.Error != nil && iter.Error != io.EOF {
- iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
- }
- }
- type fiveFieldsStructDecoder struct {
- typ reflect.Type
- fieldHash1 int32
- fieldDecoder1 *structFieldDecoder
- fieldHash2 int32
- fieldDecoder2 *structFieldDecoder
- fieldHash3 int32
- fieldDecoder3 *structFieldDecoder
- fieldHash4 int32
- fieldDecoder4 *structFieldDecoder
- fieldHash5 int32
- fieldDecoder5 *structFieldDecoder
- }
- func (decoder *fiveFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
- if !iter.readObjectStart() {
- return
- }
- for {
- switch iter.readFieldHash() {
- case decoder.fieldHash1:
- decoder.fieldDecoder1.decode(ptr, iter)
- case decoder.fieldHash2:
- decoder.fieldDecoder2.decode(ptr, iter)
- case decoder.fieldHash3:
- decoder.fieldDecoder3.decode(ptr, iter)
- case decoder.fieldHash4:
- decoder.fieldDecoder4.decode(ptr, iter)
- case decoder.fieldHash5:
- decoder.fieldDecoder5.decode(ptr, iter)
- default:
- iter.Skip()
- }
- if iter.nextToken() != ',' {
- break
- }
- }
- if iter.Error != nil && iter.Error != io.EOF {
- iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
- }
- }
- type sixFieldsStructDecoder struct {
- typ reflect.Type
- fieldHash1 int32
- fieldDecoder1 *structFieldDecoder
- fieldHash2 int32
- fieldDecoder2 *structFieldDecoder
- fieldHash3 int32
- fieldDecoder3 *structFieldDecoder
- fieldHash4 int32
- fieldDecoder4 *structFieldDecoder
- fieldHash5 int32
- fieldDecoder5 *structFieldDecoder
- fieldHash6 int32
- fieldDecoder6 *structFieldDecoder
- }
- func (decoder *sixFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
- if !iter.readObjectStart() {
- return
- }
- for {
- switch iter.readFieldHash() {
- case decoder.fieldHash1:
- decoder.fieldDecoder1.decode(ptr, iter)
- case decoder.fieldHash2:
- decoder.fieldDecoder2.decode(ptr, iter)
- case decoder.fieldHash3:
- decoder.fieldDecoder3.decode(ptr, iter)
- case decoder.fieldHash4:
- decoder.fieldDecoder4.decode(ptr, iter)
- case decoder.fieldHash5:
- decoder.fieldDecoder5.decode(ptr, iter)
- case decoder.fieldHash6:
- decoder.fieldDecoder6.decode(ptr, iter)
- default:
- iter.Skip()
- }
- if iter.nextToken() != ',' {
- break
- }
- }
- if iter.Error != nil && iter.Error != io.EOF {
- iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
- }
- }
- type sevenFieldsStructDecoder struct {
- typ reflect.Type
- fieldHash1 int32
- fieldDecoder1 *structFieldDecoder
- fieldHash2 int32
- fieldDecoder2 *structFieldDecoder
- fieldHash3 int32
- fieldDecoder3 *structFieldDecoder
- fieldHash4 int32
- fieldDecoder4 *structFieldDecoder
- fieldHash5 int32
- fieldDecoder5 *structFieldDecoder
- fieldHash6 int32
- fieldDecoder6 *structFieldDecoder
- fieldHash7 int32
- fieldDecoder7 *structFieldDecoder
- }
- func (decoder *sevenFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
- if !iter.readObjectStart() {
- return
- }
- for {
- switch iter.readFieldHash() {
- case decoder.fieldHash1:
- decoder.fieldDecoder1.decode(ptr, iter)
- case decoder.fieldHash2:
- decoder.fieldDecoder2.decode(ptr, iter)
- case decoder.fieldHash3:
- decoder.fieldDecoder3.decode(ptr, iter)
- case decoder.fieldHash4:
- decoder.fieldDecoder4.decode(ptr, iter)
- case decoder.fieldHash5:
- decoder.fieldDecoder5.decode(ptr, iter)
- case decoder.fieldHash6:
- decoder.fieldDecoder6.decode(ptr, iter)
- case decoder.fieldHash7:
- decoder.fieldDecoder7.decode(ptr, iter)
- default:
- iter.Skip()
- }
- if iter.nextToken() != ',' {
- break
- }
- }
- if iter.Error != nil && iter.Error != io.EOF {
- iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
- }
- }
- type eightFieldsStructDecoder struct {
- typ reflect.Type
- fieldHash1 int32
- fieldDecoder1 *structFieldDecoder
- fieldHash2 int32
- fieldDecoder2 *structFieldDecoder
- fieldHash3 int32
- fieldDecoder3 *structFieldDecoder
- fieldHash4 int32
- fieldDecoder4 *structFieldDecoder
- fieldHash5 int32
- fieldDecoder5 *structFieldDecoder
- fieldHash6 int32
- fieldDecoder6 *structFieldDecoder
- fieldHash7 int32
- fieldDecoder7 *structFieldDecoder
- fieldHash8 int32
- fieldDecoder8 *structFieldDecoder
- }
- func (decoder *eightFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
- if !iter.readObjectStart() {
- return
- }
- for {
- switch iter.readFieldHash() {
- case decoder.fieldHash1:
- decoder.fieldDecoder1.decode(ptr, iter)
- case decoder.fieldHash2:
- decoder.fieldDecoder2.decode(ptr, iter)
- case decoder.fieldHash3:
- decoder.fieldDecoder3.decode(ptr, iter)
- case decoder.fieldHash4:
- decoder.fieldDecoder4.decode(ptr, iter)
- case decoder.fieldHash5:
- decoder.fieldDecoder5.decode(ptr, iter)
- case decoder.fieldHash6:
- decoder.fieldDecoder6.decode(ptr, iter)
- case decoder.fieldHash7:
- decoder.fieldDecoder7.decode(ptr, iter)
- case decoder.fieldHash8:
- decoder.fieldDecoder8.decode(ptr, iter)
- default:
- iter.Skip()
- }
- if iter.nextToken() != ',' {
- break
- }
- }
- if iter.Error != nil && iter.Error != io.EOF {
- iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
- }
- }
- type nineFieldsStructDecoder struct {
- typ reflect.Type
- fieldHash1 int32
- fieldDecoder1 *structFieldDecoder
- fieldHash2 int32
- fieldDecoder2 *structFieldDecoder
- fieldHash3 int32
- fieldDecoder3 *structFieldDecoder
- fieldHash4 int32
- fieldDecoder4 *structFieldDecoder
- fieldHash5 int32
- fieldDecoder5 *structFieldDecoder
- fieldHash6 int32
- fieldDecoder6 *structFieldDecoder
- fieldHash7 int32
- fieldDecoder7 *structFieldDecoder
- fieldHash8 int32
- fieldDecoder8 *structFieldDecoder
- fieldHash9 int32
- fieldDecoder9 *structFieldDecoder
- }
- func (decoder *nineFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
- if !iter.readObjectStart() {
- return
- }
- for {
- switch iter.readFieldHash() {
- case decoder.fieldHash1:
- decoder.fieldDecoder1.decode(ptr, iter)
- case decoder.fieldHash2:
- decoder.fieldDecoder2.decode(ptr, iter)
- case decoder.fieldHash3:
- decoder.fieldDecoder3.decode(ptr, iter)
- case decoder.fieldHash4:
- decoder.fieldDecoder4.decode(ptr, iter)
- case decoder.fieldHash5:
- decoder.fieldDecoder5.decode(ptr, iter)
- case decoder.fieldHash6:
- decoder.fieldDecoder6.decode(ptr, iter)
- case decoder.fieldHash7:
- decoder.fieldDecoder7.decode(ptr, iter)
- case decoder.fieldHash8:
- decoder.fieldDecoder8.decode(ptr, iter)
- case decoder.fieldHash9:
- decoder.fieldDecoder9.decode(ptr, iter)
- default:
- iter.Skip()
- }
- if iter.nextToken() != ',' {
- break
- }
- }
- if iter.Error != nil && iter.Error != io.EOF {
- iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
- }
- }
- type tenFieldsStructDecoder struct {
- typ reflect.Type
- fieldHash1 int32
- fieldDecoder1 *structFieldDecoder
- fieldHash2 int32
- fieldDecoder2 *structFieldDecoder
- fieldHash3 int32
- fieldDecoder3 *structFieldDecoder
- fieldHash4 int32
- fieldDecoder4 *structFieldDecoder
- fieldHash5 int32
- fieldDecoder5 *structFieldDecoder
- fieldHash6 int32
- fieldDecoder6 *structFieldDecoder
- fieldHash7 int32
- fieldDecoder7 *structFieldDecoder
- fieldHash8 int32
- fieldDecoder8 *structFieldDecoder
- fieldHash9 int32
- fieldDecoder9 *structFieldDecoder
- fieldHash10 int32
- fieldDecoder10 *structFieldDecoder
- }
- func (decoder *tenFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
- if !iter.readObjectStart() {
- return
- }
- for {
- switch iter.readFieldHash() {
- case decoder.fieldHash1:
- decoder.fieldDecoder1.decode(ptr, iter)
- case decoder.fieldHash2:
- decoder.fieldDecoder2.decode(ptr, iter)
- case decoder.fieldHash3:
- decoder.fieldDecoder3.decode(ptr, iter)
- case decoder.fieldHash4:
- decoder.fieldDecoder4.decode(ptr, iter)
- case decoder.fieldHash5:
- decoder.fieldDecoder5.decode(ptr, iter)
- case decoder.fieldHash6:
- decoder.fieldDecoder6.decode(ptr, iter)
- case decoder.fieldHash7:
- decoder.fieldDecoder7.decode(ptr, iter)
- case decoder.fieldHash8:
- decoder.fieldDecoder8.decode(ptr, iter)
- case decoder.fieldHash9:
- decoder.fieldDecoder9.decode(ptr, iter)
- case decoder.fieldHash10:
- decoder.fieldDecoder10.decode(ptr, iter)
- default:
- iter.Skip()
- }
- if iter.nextToken() != ',' {
- break
- }
- }
- if iter.Error != nil && iter.Error != io.EOF {
- iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
- }
- }
- type structFieldDecoder struct {
- field *reflect.StructField
- fieldDecoder Decoder
- }
- func (decoder *structFieldDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
- fieldPtr := uintptr(ptr) + decoder.field.Offset
- decoder.fieldDecoder.decode(unsafe.Pointer(fieldPtr), iter)
- if iter.Error != nil && iter.Error != io.EOF {
- iter.Error = fmt.Errorf("%s: %s", decoder.field.Name, iter.Error.Error())
- }
- }
- type structFieldEncoder struct {
- field *reflect.StructField
- fieldName string
- fieldEncoder Encoder
- omitempty bool
- }
- func (encoder *structFieldEncoder) encode(ptr unsafe.Pointer, stream *Stream) {
- fieldPtr := uintptr(ptr) + encoder.field.Offset
- stream.WriteObjectField(encoder.fieldName)
- encoder.fieldEncoder.encode(unsafe.Pointer(fieldPtr), stream)
- if stream.Error != nil && stream.Error != io.EOF {
- stream.Error = fmt.Errorf("%s: %s", encoder.field.Name, stream.Error.Error())
- }
- }
- func (encoder *structFieldEncoder) encodeInterface(val interface{}, stream *Stream) {
- writeToStream(val, stream, encoder)
- }
- func (encoder *structFieldEncoder) isEmpty(ptr unsafe.Pointer) bool {
- fieldPtr := uintptr(ptr) + encoder.field.Offset
- return encoder.fieldEncoder.isEmpty(unsafe.Pointer(fieldPtr))
- }
- type structEncoder struct {
- fields []*structFieldEncoder
- }
- func (encoder *structEncoder) encode(ptr unsafe.Pointer, stream *Stream) {
- stream.WriteObjectStart()
- isNotFirst := false
- for _, field := range encoder.fields {
- if field.omitempty && field.isEmpty(ptr) {
- continue
- }
- if isNotFirst {
- stream.WriteMore()
- }
- field.encode(ptr, stream)
- isNotFirst = true
- }
- stream.WriteObjectEnd()
- }
- func (encoder *structEncoder) encodeInterface(val interface{}, stream *Stream) {
- var encoderToUse Encoder
- encoderToUse = encoder
- if len(encoder.fields) == 1 {
- firstEncoder := encoder.fields[0].fieldEncoder
- firstEncoderName := reflect.TypeOf(firstEncoder).String()
- // interface{} has inline optimization for this case
- if firstEncoderName == "*jsoniter.optionalEncoder" {
- encoderToUse = &structEncoder{
- fields: []*structFieldEncoder{{
- field: encoder.fields[0].field,
- fieldName: encoder.fields[0].fieldName,
- fieldEncoder: firstEncoder.(*optionalEncoder).valueEncoder,
- omitempty: encoder.fields[0].omitempty,
- }},
- }
- }
- }
- writeToStream(val, stream, encoderToUse)
- }
- func (encoder *structEncoder) isEmpty(ptr unsafe.Pointer) bool {
- for _, field := range encoder.fields {
- if !field.isEmpty(ptr) {
- return false
- }
- }
- return true
- }
- type emptyStructEncoder struct {
- }
- func (encoder *emptyStructEncoder) encode(ptr unsafe.Pointer, stream *Stream) {
- stream.WriteEmptyObject()
- }
- func (encoder *emptyStructEncoder) encodeInterface(val interface{}, stream *Stream) {
- writeToStream(val, stream, encoder)
- }
- func (encoder *emptyStructEncoder) isEmpty(ptr unsafe.Pointer) bool {
- return true
- }
|