上传编解码库 mapstring 扩展
This commit is contained in:
parent
c79db39d2b
commit
2c7bcad214
@ -10,8 +10,8 @@ import (
|
|||||||
"github.com/modern-go/reflect2"
|
"github.com/modern-go/reflect2"
|
||||||
)
|
)
|
||||||
|
|
||||||
func newSys(options core.Options) (sys *codec, err error) {
|
func newSys(options core.Options) (sys *Codec, err error) {
|
||||||
sys = &codec{
|
sys = &Codec{
|
||||||
options: &options,
|
options: &options,
|
||||||
decoderCache: new(sync.Map),
|
decoderCache: new(sync.Map),
|
||||||
encoderCache: new(sync.Map),
|
encoderCache: new(sync.Map),
|
||||||
@ -29,7 +29,7 @@ func newSys(options core.Options) (sys *codec, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
type codec struct {
|
type Codec struct {
|
||||||
options *core.Options
|
options *core.Options
|
||||||
decoderCache *sync.Map
|
decoderCache *sync.Map
|
||||||
encoderCache *sync.Map
|
encoderCache *sync.Map
|
||||||
@ -37,39 +37,18 @@ type codec struct {
|
|||||||
extraPool *sync.Pool
|
extraPool *sync.Pool
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *codec) Options() *core.Options {
|
func (this *Codec) Options() *core.Options {
|
||||||
return this.options
|
return this.options
|
||||||
}
|
}
|
||||||
|
|
||||||
//序列化Josn
|
func (this *Codec) addDecoderToCache(cacheKey uintptr, decoder core.IDecoder) {
|
||||||
func (this *codec) MarshalJson(val interface{}, option ...core.ExecuteOption) (buf []byte, err error) {
|
|
||||||
stream := this.BorrowStream()
|
|
||||||
defer this.ReturnStream(stream)
|
|
||||||
stream.WriteVal(val)
|
|
||||||
if stream.Error() != nil {
|
|
||||||
return nil, stream.Error()
|
|
||||||
}
|
|
||||||
result := stream.Buffer()
|
|
||||||
copied := make([]byte, len(result))
|
|
||||||
copy(copied, result)
|
|
||||||
return copied, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *codec) UnmarshalJson(data []byte, v interface{}) error {
|
|
||||||
extra := this.BorrowExtractor(data)
|
|
||||||
defer this.ReturnExtractor(extra)
|
|
||||||
extra.ReadVal(v)
|
|
||||||
return extra.Error()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *codec) addDecoderToCache(cacheKey uintptr, decoder core.IDecoder) {
|
|
||||||
this.decoderCache.Store(cacheKey, decoder)
|
this.decoderCache.Store(cacheKey, decoder)
|
||||||
}
|
}
|
||||||
func (this *codec) addEncoderToCache(cacheKey uintptr, encoder core.IEncoder) {
|
func (this *Codec) addEncoderToCache(cacheKey uintptr, encoder core.IEncoder) {
|
||||||
this.encoderCache.Store(cacheKey, encoder)
|
this.encoderCache.Store(cacheKey, encoder)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *codec) GetEncoderFromCache(cacheKey uintptr) core.IEncoder {
|
func (this *Codec) GetEncoderFromCache(cacheKey uintptr) core.IEncoder {
|
||||||
encoder, found := this.encoderCache.Load(cacheKey)
|
encoder, found := this.encoderCache.Load(cacheKey)
|
||||||
if found {
|
if found {
|
||||||
return encoder.(core.IEncoder)
|
return encoder.(core.IEncoder)
|
||||||
@ -77,7 +56,7 @@ func (this *codec) GetEncoderFromCache(cacheKey uintptr) core.IEncoder {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *codec) GetDecoderFromCache(cacheKey uintptr) core.IDecoder {
|
func (this *Codec) GetDecoderFromCache(cacheKey uintptr) core.IDecoder {
|
||||||
decoder, found := this.decoderCache.Load(cacheKey)
|
decoder, found := this.decoderCache.Load(cacheKey)
|
||||||
if found {
|
if found {
|
||||||
return decoder.(core.IDecoder)
|
return decoder.(core.IDecoder)
|
||||||
@ -85,7 +64,7 @@ func (this *codec) GetDecoderFromCache(cacheKey uintptr) core.IDecoder {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *codec) EncoderOf(typ reflect2.Type) core.IEncoder {
|
func (this *Codec) EncoderOf(typ reflect2.Type) core.IEncoder {
|
||||||
cacheKey := typ.RType()
|
cacheKey := typ.RType()
|
||||||
encoder := this.GetEncoderFromCache(cacheKey)
|
encoder := this.GetEncoderFromCache(cacheKey)
|
||||||
if encoder != nil {
|
if encoder != nil {
|
||||||
@ -105,7 +84,7 @@ func (this *codec) EncoderOf(typ reflect2.Type) core.IEncoder {
|
|||||||
return encoder
|
return encoder
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *codec) DecoderOf(typ reflect2.Type) core.IDecoder {
|
func (this *Codec) DecoderOf(typ reflect2.Type) core.IDecoder {
|
||||||
cacheKey := typ.RType()
|
cacheKey := typ.RType()
|
||||||
decoder := this.GetDecoderFromCache(cacheKey)
|
decoder := this.GetDecoderFromCache(cacheKey)
|
||||||
if decoder != nil {
|
if decoder != nil {
|
||||||
@ -123,57 +102,89 @@ func (this *codec) DecoderOf(typ reflect2.Type) core.IDecoder {
|
|||||||
return decoder
|
return decoder
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *codec) BorrowStream() core.IStream {
|
func (this *Codec) BorrowStream() core.IStream {
|
||||||
stream := this.streamPool.Get().(core.IStream)
|
stream := this.streamPool.Get().(core.IStream)
|
||||||
return stream
|
return stream
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *codec) ReturnStream(stream core.IStream) {
|
func (this *Codec) ReturnStream(stream core.IStream) {
|
||||||
this.streamPool.Put(stream)
|
this.streamPool.Put(stream)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *codec) BorrowExtractor(buf []byte) core.IExtractor {
|
func (this *Codec) BorrowExtractor(buf []byte) core.IExtractor {
|
||||||
extra := this.extraPool.Get().(core.IExtractor)
|
extra := this.extraPool.Get().(core.IExtractor)
|
||||||
extra.ResetBytes(buf)
|
extra.ResetBytes(buf)
|
||||||
return extra
|
return extra
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *codec) ReturnExtractor(extra core.IExtractor) {
|
func (this *Codec) ReturnExtractor(extra core.IExtractor) {
|
||||||
this.extraPool.Put(extra)
|
this.extraPool.Put(extra)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//编码对象到json
|
||||||
|
func (this *Codec) MarshalJson(val interface{}, option ...core.ExecuteOption) (buf []byte, err error) {
|
||||||
|
stream := this.BorrowStream()
|
||||||
|
defer this.ReturnStream(stream)
|
||||||
|
stream.WriteVal(val)
|
||||||
|
if stream.Error() != nil {
|
||||||
|
return nil, stream.Error()
|
||||||
|
}
|
||||||
|
result := stream.Buffer()
|
||||||
|
copied := make([]byte, len(result))
|
||||||
|
copy(copied, result)
|
||||||
|
return copied, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
//解码json到对象
|
||||||
|
func (this *Codec) UnmarshalJson(data []byte, v interface{}) error {
|
||||||
|
extra := this.BorrowExtractor(data)
|
||||||
|
defer this.ReturnExtractor(extra)
|
||||||
|
extra.ReadVal(v)
|
||||||
|
return extra.Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
//编码对象到mapjson
|
||||||
|
func (this *Codec) MarshalMapJson(val interface{}, option ...core.ExecuteOption) (ret map[string]string, err error) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
//解码mapjson到对象
|
||||||
|
func (this *Codec) UnmarshalMapString(data []byte, v interface{}) error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
///日志***********************************************************************
|
///日志***********************************************************************
|
||||||
func (this *codec) Debug() bool {
|
func (this *Codec) Debug() bool {
|
||||||
return this.options.Debug
|
return this.options.Debug
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *codec) Debugf(format string, a ...interface{}) {
|
func (this *Codec) Debugf(format string, a ...interface{}) {
|
||||||
if this.options.Debug {
|
if this.options.Debug {
|
||||||
this.options.Log.Debugf("[SYS Gin] "+format, a...)
|
this.options.Log.Debugf("[SYS Codec] "+format, a...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
func (this *codec) Infof(format string, a ...interface{}) {
|
func (this *Codec) Infof(format string, a ...interface{}) {
|
||||||
if this.options.Debug {
|
if this.options.Debug {
|
||||||
this.options.Log.Infof("[SYS Gin] "+format, a...)
|
this.options.Log.Infof("[SYS Codec] "+format, a...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
func (this *codec) Warnf(format string, a ...interface{}) {
|
func (this *Codec) Warnf(format string, a ...interface{}) {
|
||||||
if this.options.Debug {
|
if this.options.Debug {
|
||||||
this.options.Log.Warnf("[SYS Gin] "+format, a...)
|
this.options.Log.Warnf("[SYS Codec] "+format, a...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
func (this *codec) Errorf(format string, a ...interface{}) {
|
func (this *Codec) Errorf(format string, a ...interface{}) {
|
||||||
if this.options.Debug {
|
if this.options.Debug {
|
||||||
this.options.Log.Errorf("[SYS Gin] "+format, a...)
|
this.options.Log.Errorf("[SYS Codec] "+format, a...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
func (this *codec) Panicf(format string, a ...interface{}) {
|
func (this *Codec) Panicf(format string, a ...interface{}) {
|
||||||
if this.options.Debug {
|
if this.options.Debug {
|
||||||
this.options.Log.Panicf("[SYS Gin] "+format, a...)
|
this.options.Log.Panicf("[SYS Codec] "+format, a...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
func (this *codec) Fatalf(format string, a ...interface{}) {
|
func (this *Codec) Fatalf(format string, a ...interface{}) {
|
||||||
if this.options.Debug {
|
if this.options.Debug {
|
||||||
this.options.Log.Fatalf("[SYS Gin] "+format, a...)
|
this.options.Log.Fatalf("[SYS Codec] "+format, a...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -106,6 +106,7 @@ type (
|
|||||||
WriteFloat64(val float64)
|
WriteFloat64(val float64)
|
||||||
WriteString(val string)
|
WriteString(val string)
|
||||||
WriteBytes(val []byte)
|
WriteBytes(val []byte)
|
||||||
|
Reset(bufSize int)
|
||||||
Buffer() []byte //返回缓存区数据
|
Buffer() []byte //返回缓存区数据
|
||||||
Error() error
|
Error() error
|
||||||
SetErr(err error)
|
SetErr(err error)
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package factory
|
package factory
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"reflect"
|
"reflect"
|
||||||
@ -63,7 +64,7 @@ func encoderOfStruct(ctx *core.Ctx, typ reflect2.Type) core.IEncoder {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return &structEncoder{typ, finalOrderedFields}
|
return &structEncoder{ctx.ICodec, typ, finalOrderedFields}
|
||||||
}
|
}
|
||||||
|
|
||||||
func decoderOfStruct(ctx *core.Ctx, typ reflect2.Type) core.IDecoder {
|
func decoderOfStruct(ctx *core.Ctx, typ reflect2.Type) core.IDecoder {
|
||||||
@ -97,7 +98,7 @@ func decoderOfStruct(ctx *core.Ctx, typ reflect2.Type) core.IDecoder {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return createStructDecoder(ctx.Options(), typ, fields)
|
return createStructDecoder(ctx.ICodec, typ, fields)
|
||||||
}
|
}
|
||||||
|
|
||||||
//结构第编辑码构建
|
//结构第编辑码构建
|
||||||
@ -205,11 +206,11 @@ func calcFieldNames(originalFieldName string, tagProvidedFieldName string, whole
|
|||||||
return fieldNames
|
return fieldNames
|
||||||
}
|
}
|
||||||
|
|
||||||
func createStructDecoder(opt *core.Options, typ reflect2.Type, fields map[string]*structFieldDecoder) core.IDecoder {
|
func createStructDecoder(codec core.ICodec, typ reflect2.Type, fields map[string]*structFieldDecoder) core.IDecoder {
|
||||||
if opt.DisallowUnknownFields {
|
if codec.Options().DisallowUnknownFields {
|
||||||
return &structDecoder{typ: typ, fields: fields, disallowUnknownFields: true}
|
return &structDecoder{typ: typ, fields: fields, disallowUnknownFields: true}
|
||||||
} else {
|
} else {
|
||||||
return &structDecoder{opt, typ, fields, false}
|
return &structDecoder{codec, typ, fields, false}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -244,6 +245,7 @@ func resolveConflictBinding(opt *core.Options, old, new *Binding) (ignoreOld, ig
|
|||||||
|
|
||||||
//结构对象 编解码-----------------------------------------------------------------------------------------------------------------------
|
//结构对象 编解码-----------------------------------------------------------------------------------------------------------------------
|
||||||
type structEncoder struct {
|
type structEncoder struct {
|
||||||
|
codec core.ICodec
|
||||||
typ reflect2.Type
|
typ reflect2.Type
|
||||||
fields []structFieldTo
|
fields []structFieldTo
|
||||||
}
|
}
|
||||||
@ -271,12 +273,33 @@ func (this *structEncoder) Encode(ptr unsafe.Pointer, stream core.IStream) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (this *structEncoder) EncodeToMapString(ptr unsafe.Pointer) (ret map[string]string, err error) {
|
||||||
|
ret = make(map[string]string)
|
||||||
|
stream := this.codec.BorrowStream()
|
||||||
|
for _, field := range this.fields {
|
||||||
|
if field.encoder.omitempty && field.encoder.IsEmpty(ptr) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if field.encoder.IsEmbeddedPtrNil(ptr) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
stream.Reset(512)
|
||||||
|
field.encoder.Encode(ptr, stream)
|
||||||
|
if stream.Error() != nil && stream.Error() != io.EOF {
|
||||||
|
err = stream.Error()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
ret[field.toName] = BytesToString(stream.Buffer())
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func (this *structEncoder) IsEmpty(ptr unsafe.Pointer) bool {
|
func (this *structEncoder) IsEmpty(ptr unsafe.Pointer) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
type structDecoder struct {
|
type structDecoder struct {
|
||||||
opt *core.Options
|
codec core.ICodec
|
||||||
typ reflect2.Type
|
typ reflect2.Type
|
||||||
fields map[string]*structFieldDecoder
|
fields map[string]*structFieldDecoder
|
||||||
disallowUnknownFields bool
|
disallowUnknownFields bool
|
||||||
@ -302,7 +325,7 @@ func (this *structDecoder) decodeField(ptr unsafe.Pointer, extra core.IExtractor
|
|||||||
|
|
||||||
field = extra.ReadString()
|
field = extra.ReadString()
|
||||||
fieldDecoder = this.fields[field]
|
fieldDecoder = this.fields[field]
|
||||||
if fieldDecoder == nil && !this.opt.CaseSensitive {
|
if fieldDecoder == nil && !this.codec.Options().CaseSensitive {
|
||||||
fieldDecoder = this.fields[strings.ToLower(field)]
|
fieldDecoder = this.fields[strings.ToLower(field)]
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -324,6 +347,32 @@ func (this *structDecoder) decodeField(ptr unsafe.Pointer, extra core.IExtractor
|
|||||||
fieldDecoder.Decode(ptr, extra)
|
fieldDecoder.Decode(ptr, extra)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//解码对象从MapJson 中
|
||||||
|
func (this *structDecoder) DecodeForMapString(ptr unsafe.Pointer, extra map[string]string) (err error) {
|
||||||
|
var fieldDecoder *structFieldDecoder
|
||||||
|
ext := this.codec.BorrowExtractor([]byte{})
|
||||||
|
for k, v := range extra {
|
||||||
|
fieldDecoder = this.fields[k]
|
||||||
|
if fieldDecoder == nil && !this.codec.Options().CaseSensitive {
|
||||||
|
fieldDecoder = this.fields[strings.ToLower(k)]
|
||||||
|
}
|
||||||
|
if fieldDecoder == nil {
|
||||||
|
if this.disallowUnknownFields {
|
||||||
|
err = errors.New("found unknown field: " + k)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
ext.ResetBytes(StringToBytes(v))
|
||||||
|
fieldDecoder.Decode(ptr, ext)
|
||||||
|
if ext.Error() != nil && ext.Error() != io.EOF {
|
||||||
|
err = ext.Error()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
//结构对象字段 编解码-----------------------------------------------------------------------------------------------------------------------
|
//结构对象字段 编解码-----------------------------------------------------------------------------------------------------------------------
|
||||||
type structFieldTo struct {
|
type structFieldTo struct {
|
||||||
encoder *structFieldEncoder
|
encoder *structFieldEncoder
|
||||||
|
@ -146,6 +146,12 @@ func (this *JsonStream) WriteString(val string) {
|
|||||||
func (this *JsonStream) WriteBytes(val []byte) {
|
func (this *JsonStream) WriteBytes(val []byte) {
|
||||||
this.buf = append(this.buf, val...)
|
this.buf = append(this.buf, val...)
|
||||||
}
|
}
|
||||||
|
func (this *JsonStream) Reset(bufSize int) {
|
||||||
|
this.buf = make([]byte, 0, bufSize)
|
||||||
|
this.err = nil
|
||||||
|
this.indention = 0
|
||||||
|
return
|
||||||
|
}
|
||||||
func (this *JsonStream) Buffer() []byte {
|
func (this *JsonStream) Buffer() []byte {
|
||||||
return this.buf
|
return this.buf
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user