From a57c8c620260e72775debaf29514fc2b9e7fe513 Mon Sep 17 00:00:00 2001 From: Tao Wen Date: Mon, 9 Jan 2017 21:00:01 +0800 Subject: [PATCH] test array of interface --- feature_reflect.go | 4 +++- feature_reflect_native.go | 8 ++++++-- jsoniter_interface_test.go | 14 ++++++++++++++ 3 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 jsoniter_interface_test.go diff --git a/feature_reflect.go b/feature_reflect.go index c64cb0b3..070f8a12 100644 --- a/feature_reflect.go +++ b/feature_reflect.go @@ -398,7 +398,7 @@ func decoderOfType(typ reflect.Type) (Decoder, error) { case reflect.Bool: return &boolCodec{}, nil case reflect.Interface: - return &interfaceDecoder{}, nil + return &interfaceCodec{}, nil case reflect.Struct: return prefix(fmt.Sprintf("[%s]", typeName)).addToDecoder(decoderOfStruct(typ)) case reflect.Slice: @@ -443,6 +443,8 @@ func encoderOfType(typ reflect.Type) (Encoder, error) { return &float64Codec{}, nil case reflect.Bool: return &boolCodec{}, nil + case reflect.Interface: + return &interfaceCodec{}, nil case reflect.Struct: return prefix(fmt.Sprintf("[%s]", typeName)).addToEncoder(encoderOfStruct(typ)) case reflect.Slice: diff --git a/feature_reflect_native.go b/feature_reflect_native.go index af0d241b..af8c441f 100644 --- a/feature_reflect_native.go +++ b/feature_reflect_native.go @@ -156,13 +156,17 @@ func (codec *boolCodec) encode(ptr unsafe.Pointer, stream *Stream) { stream.WriteBool(*((*bool)(ptr))) } -type interfaceDecoder struct { +type interfaceCodec struct { } -func (decoder *interfaceDecoder) decode(ptr unsafe.Pointer, iter *Iterator) { +func (codec *interfaceCodec) decode(ptr unsafe.Pointer, iter *Iterator) { *((*interface{})(ptr)) = iter.ReadAny().Get() } +func (codec *interfaceCodec) encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteVal(*((*interface{})(ptr))) +} + type anyDecoder struct { } diff --git a/jsoniter_interface_test.go b/jsoniter_interface_test.go new file mode 100644 index 00000000..b16b5906 --- /dev/null +++ b/jsoniter_interface_test.go @@ -0,0 +1,14 @@ +package jsoniter + +import ( + "testing" + "github.com/json-iterator/go/require" +) + +func Test_write_array_of_interface(t *testing.T) { + should := require.New(t) + array := []interface{}{"hello"} + str, err := MarshalToString(array) + should.Nil(err) + should.Equal(`["hello"]`, str) +} \ No newline at end of file