diff --git a/feature_reflect.go b/feature_reflect.go index c64cb0b..070f8a1 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 af0d241..af8c441 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 0000000..b16b590 --- /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