1
0
mirror of https://github.com/json-iterator/go.git synced 2025-03-23 21:09:11 +02:00

#71 fix html escape for string alias

This commit is contained in:
Tao Wen 2017-06-26 09:57:45 +08:00
parent dcc91365ee
commit 81e64121ba
2 changed files with 94 additions and 4 deletions

View File

@ -246,7 +246,8 @@ func decoderOfType(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) {
} }
func createDecoderOfType(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) { func createDecoderOfType(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) {
if typ.String() == "[]uint8" { typeName := typ.String()
if typeName == "[]uint8" {
return &base64Codec{}, nil return &base64Codec{}, nil
} }
if typ.AssignableTo(jsonRawMessageType) { if typ.AssignableTo(jsonRawMessageType) {
@ -271,32 +272,74 @@ func createDecoderOfType(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error
} }
switch typ.Kind() { switch typ.Kind() {
case reflect.String: case reflect.String:
if typeName != "string" {
return decoderOfType(cfg, reflect.TypeOf((*string)(nil)).Elem())
}
return &stringCodec{}, nil return &stringCodec{}, nil
case reflect.Int: case reflect.Int:
if typeName != "int" {
return decoderOfType(cfg, reflect.TypeOf((*int)(nil)).Elem())
}
return &intCodec{}, nil return &intCodec{}, nil
case reflect.Int8: case reflect.Int8:
if typeName != "int8" {
return decoderOfType(cfg, reflect.TypeOf((*int8)(nil)).Elem())
}
return &int8Codec{}, nil return &int8Codec{}, nil
case reflect.Int16: case reflect.Int16:
if typeName != "int16" {
return decoderOfType(cfg, reflect.TypeOf((*int16)(nil)).Elem())
}
return &int16Codec{}, nil return &int16Codec{}, nil
case reflect.Int32: case reflect.Int32:
if typeName != "int32" {
return decoderOfType(cfg, reflect.TypeOf((*int32)(nil)).Elem())
}
return &int32Codec{}, nil return &int32Codec{}, nil
case reflect.Int64: case reflect.Int64:
if typeName != "int64" {
return decoderOfType(cfg, reflect.TypeOf((*int64)(nil)).Elem())
}
return &int64Codec{}, nil return &int64Codec{}, nil
case reflect.Uint: case reflect.Uint:
if typeName != "uint" {
return decoderOfType(cfg, reflect.TypeOf((*uint)(nil)).Elem())
}
return &uintCodec{}, nil return &uintCodec{}, nil
case reflect.Uint8: case reflect.Uint8:
if typeName != "uint8" {
return decoderOfType(cfg, reflect.TypeOf((*uint8)(nil)).Elem())
}
return &uint8Codec{}, nil return &uint8Codec{}, nil
case reflect.Uint16: case reflect.Uint16:
if typeName != "uint16" {
return decoderOfType(cfg, reflect.TypeOf((*uint16)(nil)).Elem())
}
return &uint16Codec{}, nil return &uint16Codec{}, nil
case reflect.Uint32: case reflect.Uint32:
if typeName != "uint32" {
return decoderOfType(cfg, reflect.TypeOf((*uint32)(nil)).Elem())
}
return &uint32Codec{}, nil return &uint32Codec{}, nil
case reflect.Uint64: case reflect.Uint64:
if typeName != "uint64" {
return decoderOfType(cfg, reflect.TypeOf((*uint64)(nil)).Elem())
}
return &uint64Codec{}, nil return &uint64Codec{}, nil
case reflect.Float32: case reflect.Float32:
if typeName != "float32" {
return decoderOfType(cfg, reflect.TypeOf((*float32)(nil)).Elem())
}
return &float32Codec{}, nil return &float32Codec{}, nil
case reflect.Float64: case reflect.Float64:
if typeName != "float64" {
return decoderOfType(cfg, reflect.TypeOf((*float64)(nil)).Elem())
}
return &float64Codec{}, nil return &float64Codec{}, nil
case reflect.Bool: case reflect.Bool:
if typeName != "bool" {
return decoderOfType(cfg, reflect.TypeOf((*bool)(nil)).Elem())
}
return &boolCodec{}, nil return &boolCodec{}, nil
case reflect.Interface: case reflect.Interface:
if typ.NumMethod() == 0 { if typ.NumMethod() == 0 {
@ -305,7 +348,7 @@ func createDecoderOfType(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error
return &nonEmptyInterfaceCodec{}, nil return &nonEmptyInterfaceCodec{}, nil
} }
case reflect.Struct: case reflect.Struct:
return prefix(fmt.Sprintf("[%s]", typ.String())).addToDecoder(decoderOfStruct(cfg, typ)) return prefix(fmt.Sprintf("[%s]", typeName)).addToDecoder(decoderOfStruct(cfg, typ))
case reflect.Array: case reflect.Array:
return prefix("[array]").addToDecoder(decoderOfArray(cfg, typ)) return prefix("[array]").addToDecoder(decoderOfArray(cfg, typ))
case reflect.Slice: case reflect.Slice:
@ -341,7 +384,8 @@ func encoderOfType(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
} }
func createEncoderOfType(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) { func createEncoderOfType(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
if typ.String() == "[]uint8" { typeName := typ.String()
if typeName == "[]uint8" {
return &base64Codec{}, nil return &base64Codec{}, nil
} }
if typ.AssignableTo(jsonRawMessageType) { if typ.AssignableTo(jsonRawMessageType) {
@ -367,32 +411,74 @@ func createEncoderOfType(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error
kind := typ.Kind() kind := typ.Kind()
switch kind { switch kind {
case reflect.String: case reflect.String:
if typeName != "string" {
return encoderOfType(cfg, reflect.TypeOf((*string)(nil)).Elem())
}
return &stringCodec{}, nil return &stringCodec{}, nil
case reflect.Int: case reflect.Int:
if typeName != "int" {
return encoderOfType(cfg, reflect.TypeOf((*int)(nil)).Elem())
}
return &intCodec{}, nil return &intCodec{}, nil
case reflect.Int8: case reflect.Int8:
if typeName != "int8" {
return encoderOfType(cfg, reflect.TypeOf((*int8)(nil)).Elem())
}
return &int8Codec{}, nil return &int8Codec{}, nil
case reflect.Int16: case reflect.Int16:
if typeName != "int16" {
return encoderOfType(cfg, reflect.TypeOf((*int16)(nil)).Elem())
}
return &int16Codec{}, nil return &int16Codec{}, nil
case reflect.Int32: case reflect.Int32:
if typeName != "int32" {
return encoderOfType(cfg, reflect.TypeOf((*int32)(nil)).Elem())
}
return &int32Codec{}, nil return &int32Codec{}, nil
case reflect.Int64: case reflect.Int64:
if typeName != "int64" {
return encoderOfType(cfg, reflect.TypeOf((*int64)(nil)).Elem())
}
return &int64Codec{}, nil return &int64Codec{}, nil
case reflect.Uint: case reflect.Uint:
if typeName != "uint" {
return encoderOfType(cfg, reflect.TypeOf((*uint)(nil)).Elem())
}
return &uintCodec{}, nil return &uintCodec{}, nil
case reflect.Uint8: case reflect.Uint8:
if typeName != "uint8" {
return encoderOfType(cfg, reflect.TypeOf((*uint8)(nil)).Elem())
}
return &uint8Codec{}, nil return &uint8Codec{}, nil
case reflect.Uint16: case reflect.Uint16:
if typeName != "uint16" {
return encoderOfType(cfg, reflect.TypeOf((*uint16)(nil)).Elem())
}
return &uint16Codec{}, nil return &uint16Codec{}, nil
case reflect.Uint32: case reflect.Uint32:
if typeName != "uint32" {
return encoderOfType(cfg, reflect.TypeOf((*uint32)(nil)).Elem())
}
return &uint32Codec{}, nil return &uint32Codec{}, nil
case reflect.Uint64: case reflect.Uint64:
if typeName != "uint164" {
return encoderOfType(cfg, reflect.TypeOf((*uint64)(nil)).Elem())
}
return &uint64Codec{}, nil return &uint64Codec{}, nil
case reflect.Float32: case reflect.Float32:
if typeName != "float32" {
return encoderOfType(cfg, reflect.TypeOf((*float32)(nil)).Elem())
}
return &float32Codec{}, nil return &float32Codec{}, nil
case reflect.Float64: case reflect.Float64:
if typeName != "float64" {
return encoderOfType(cfg, reflect.TypeOf((*float64)(nil)).Elem())
}
return &float64Codec{}, nil return &float64Codec{}, nil
case reflect.Bool: case reflect.Bool:
if typeName != "bool" {
return encoderOfType(cfg, reflect.TypeOf((*bool)(nil)).Elem())
}
return &boolCodec{}, nil return &boolCodec{}, nil
case reflect.Interface: case reflect.Interface:
if typ.NumMethod() == 0 { if typ.NumMethod() == 0 {
@ -401,7 +487,7 @@ func createEncoderOfType(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error
return &nonEmptyInterfaceCodec{}, nil return &nonEmptyInterfaceCodec{}, nil
} }
case reflect.Struct: case reflect.Struct:
return prefix(fmt.Sprintf("[%s]", typ.String())).addToEncoder(encoderOfStruct(cfg, typ)) return prefix(fmt.Sprintf("[%s]", typeName)).addToEncoder(encoderOfStruct(cfg, typ))
case reflect.Array: case reflect.Array:
return prefix("[array]").addToEncoder(encoderOfArray(cfg, typ)) return prefix("[array]").addToEncoder(encoderOfArray(cfg, typ))
case reflect.Slice: case reflect.Slice:

View File

@ -101,6 +101,10 @@ func Test_html_escape(t *testing.T) {
output, err = ConfigCompatibleWithStandardLibrary.Marshal(`>`) output, err = ConfigCompatibleWithStandardLibrary.Marshal(`>`)
should.Nil(err) should.Nil(err)
should.Equal(`"\u003e"`, string(output)) should.Equal(`"\u003e"`, string(output))
type MyString string
output, err = ConfigCompatibleWithStandardLibrary.Marshal(MyString(`>`))
should.Nil(err)
should.Equal(`"\u003e"`, string(output))
} }
func Test_string_encode_with_std(t *testing.T) { func Test_string_encode_with_std(t *testing.T) {