1
0
mirror of https://github.com/json-iterator/go.git synced 2025-05-13 21:36:29 +02:00

move any codec

This commit is contained in:
Tao Wen 2018-02-20 23:04:04 +08:00
parent 63ea5e3131
commit b79587753b
2 changed files with 53 additions and 39 deletions

26
any.go
View File

@ -245,6 +245,32 @@ func locatePath(iter *Iterator, path []interface{}) Any {
return iter.readAny() return iter.readAny()
} }
var anyType = reflect.TypeOf((*Any)(nil)).Elem()
func createDecoderOfAny(cfg *frozenConfig, prefix string, typ reflect.Type) ValDecoder {
if typ == anyType {
return &directAnyCodec{}
}
if typ.Implements(anyType) {
return &anyCodec{
valType: reflect2.Type2(typ),
}
}
return nil
}
func createEncoderOfAny(cfg *frozenConfig, prefix string, typ reflect.Type) ValEncoder {
if typ == anyType {
return &directAnyCodec{}
}
if typ.Implements(anyType) {
return &anyCodec{
valType: reflect2.Type2(typ),
}
}
return nil
}
type anyCodec struct { type anyCodec struct {
valType reflect2.Type valType reflect2.Type
} }

View File

@ -38,7 +38,6 @@ type checkIsEmpty interface {
var jsonRawMessageType reflect.Type var jsonRawMessageType reflect.Type
var jsoniterRawMessageType reflect.Type var jsoniterRawMessageType reflect.Type
var anyType reflect.Type
var marshalerType reflect.Type var marshalerType reflect.Type
var unmarshalerType reflect.Type var unmarshalerType reflect.Type
var textMarshalerType reflect.Type var textMarshalerType reflect.Type
@ -47,7 +46,6 @@ var textUnmarshalerType reflect.Type
func init() { func init() {
jsonRawMessageType = reflect.TypeOf((*json.RawMessage)(nil)).Elem() jsonRawMessageType = reflect.TypeOf((*json.RawMessage)(nil)).Elem()
jsoniterRawMessageType = reflect.TypeOf((*RawMessage)(nil)).Elem() jsoniterRawMessageType = reflect.TypeOf((*RawMessage)(nil)).Elem()
anyType = reflect.TypeOf((*Any)(nil)).Elem()
marshalerType = reflect.TypeOf((*json.Marshaler)(nil)).Elem() marshalerType = reflect.TypeOf((*json.Marshaler)(nil)).Elem()
unmarshalerType = reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() unmarshalerType = reflect.TypeOf((*json.Unmarshaler)(nil)).Elem()
textMarshalerType = reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem() textMarshalerType = reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem()
@ -105,7 +103,6 @@ func decoderOfType(cfg *frozenConfig, prefix string, typ reflect.Type) ValDecode
} }
func createDecoderOfType(cfg *frozenConfig, prefix string, typ reflect.Type) ValDecoder { func createDecoderOfType(cfg *frozenConfig, prefix string, typ reflect.Type) ValDecoder {
typeName := typ.String()
decoder := createDecoderOfJsonRawMessage(cfg, prefix, typ) decoder := createDecoderOfJsonRawMessage(cfg, prefix, typ)
if decoder != nil { if decoder != nil {
return decoder return decoder
@ -118,11 +115,9 @@ func createDecoderOfType(cfg *frozenConfig, prefix string, typ reflect.Type) Val
if decoder != nil { if decoder != nil {
return decoder return decoder
} }
if typ == anyType { decoder = createDecoderOfAny(cfg, prefix, typ)
return &directAnyCodec{} if decoder != nil {
} return decoder
if typ.Implements(anyType) {
return &anyCodec{}
} }
decoder = createDecoderOfNative(cfg, prefix, typ) decoder = createDecoderOfNative(cfg, prefix, typ)
if decoder != nil { if decoder != nil {
@ -230,15 +225,31 @@ func createEncoderOfType(cfg *frozenConfig, prefix string, typ reflect.Type) Val
if encoder != nil { if encoder != nil {
return encoder return encoder
} }
if typ == anyType { encoder = createEncoderOfAny(cfg, prefix, typ)
return &directAnyCodec{} if encoder != nil {
return encoder
} }
if typ.Implements(anyType) { encoder = createEncoderOfNative(cfg, prefix, typ)
return &anyCodec{ if encoder != nil {
valType: reflect2.Type2(typ), return encoder
} }
kind := typ.Kind()
switch kind {
case reflect.Interface:
return &dynamicEncoder{reflect2.Type2(typ)}
case reflect.Struct:
return encoderOfStruct(cfg, prefix, typ)
case reflect.Array:
return encoderOfArray(cfg, prefix, typ)
case reflect.Slice:
return encoderOfSlice(cfg, prefix, typ)
case reflect.Map:
return encoderOfMap(cfg, prefix, typ)
case reflect.Ptr:
return encoderOfOptional(cfg, prefix, typ)
default:
return &lazyErrorEncoder{err: fmt.Errorf("%s%s is unsupported type", prefix, typ.String())}
} }
return createEncoderOfSimpleType(cfg, prefix, typ)
} }
func createCheckIsEmpty(cfg *frozenConfig, typ reflect.Type) checkIsEmpty { func createCheckIsEmpty(cfg *frozenConfig, typ reflect.Type) checkIsEmpty {
@ -291,29 +302,6 @@ func createCheckIsEmpty(cfg *frozenConfig, typ reflect.Type) checkIsEmpty {
} }
} }
func createEncoderOfSimpleType(cfg *frozenConfig, prefix string, typ reflect.Type) ValEncoder {
encoder := createEncoderOfNative(cfg, prefix, typ)
if encoder != nil {
return encoder
}
kind := typ.Kind()
switch kind {
case reflect.Interface:
return &dynamicEncoder{reflect2.Type2(typ)}
case reflect.Struct:
return encoderOfStruct(cfg, prefix, typ)
case reflect.Array:
return encoderOfArray(cfg, prefix, typ)
case reflect.Slice:
return encoderOfSlice(cfg, prefix, typ)
case reflect.Map:
return encoderOfMap(cfg, prefix, typ)
case reflect.Ptr:
return encoderOfOptional(cfg, prefix, typ)
default:
return &lazyErrorEncoder{err: fmt.Errorf("%s%s is unsupported type", prefix, typ.String())}
}
}
type placeholderDecoder struct { type placeholderDecoder struct {
cfg *frozenConfig cfg *frozenConfig