Forráskód Böngészése

Merge pull request #225 from mgood/empty-array-fix

Fix encoding 0-length arrays
Tao Wen 7 éve
szülő
commit
e31252f2e2
2 módosított fájl, 26 hozzáadás és 0 törlés
  1. 17 0
      feature_reflect_array.go
  2. 9 0
      jsoniter_fixed_array_test.go

+ 17 - 0
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

+ 9 - 0
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