diff --git a/feature_reflect_array.go b/feature_reflect_array.go index f4e211d..a6dd91c 100644 --- a/feature_reflect_array.go +++ b/feature_reflect_array.go @@ -13,6 +13,9 @@ func decoderOfArray(cfg *frozenConfig, prefix string, typ reflect.Type) ValDecod } func encoderOfArray(cfg *frozenConfig, prefix string, typ reflect.Type) ValEncoder { + if typ.Len() == 0 { + return emptyArrayEncoder{} + } encoder := encoderOfType(cfg, prefix+"[array]->", typ.Elem()) if typ.Elem().Kind() == reflect.Map { encoder = &OptionalEncoder{encoder} @@ -20,6 +23,20 @@ func encoderOfArray(cfg *frozenConfig, prefix string, typ reflect.Type) ValEncod return &arrayEncoder{typ, typ.Elem(), encoder} } +type emptyArrayEncoder struct{} + +func (encoder emptyArrayEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteEmptyArray() +} + +func (encoder emptyArrayEncoder) EncodeInterface(val interface{}, stream *Stream) { + stream.WriteEmptyArray() +} + +func (encoder emptyArrayEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return true +} + type arrayEncoder struct { arrayType reflect.Type elemType reflect.Type diff --git a/jsoniter_fixed_array_test.go b/jsoniter_fixed_array_test.go index 6824b11..cbe50a0 100644 --- a/jsoniter_fixed_array_test.go +++ b/jsoniter_fixed_array_test.go @@ -15,6 +15,15 @@ func Test_encode_fixed_array(t *testing.T) { should.Equal("[0.1,1]", output) } +func Test_encode_fixed_array_empty(t *testing.T) { + should := require.New(t) + type FixedArray [0]float64 + fixed := FixedArray{} + output, err := MarshalToString(fixed) + should.Nil(err) + should.Equal("[]", output) +} + func Test_encode_fixed_array_of_map(t *testing.T) { should := require.New(t) type FixedArray [2]map[string]string