Pārlūkot izejas kodu

#91 fix one ptr embedded struct

Tao Wen 8 gadi atpakaļ
vecāks
revīzija
04eae11ba5
2 mainītis faili ar 36 papildinājumiem un 0 dzēšanām
  1. 17 0
      feature_reflect_extension.go
  2. 19 0
      jsoniter_interface_test.go

+ 17 - 0
feature_reflect_extension.go

@@ -277,6 +277,8 @@ func createStructDescriptor(cfg *frozenConfig, typ reflect.Type, bindings []*Bin
 			fallthrough
 		case reflect.Map:
 			onePtrOptimization = true
+		case reflect.Struct:
+			onePtrOptimization = isStructOnePtr(firstField.Type)
 		}
 	}
 	structDescriptor := &StructDescriptor{
@@ -296,6 +298,21 @@ func createStructDescriptor(cfg *frozenConfig, typ reflect.Type, bindings []*Bin
 	return structDescriptor
 }
 
+func isStructOnePtr(typ reflect.Type) bool {
+	if typ.NumField() == 1 {
+		firstField := typ.Field(0)
+		switch firstField.Type.Kind() {
+		case reflect.Ptr:
+			return true
+		case reflect.Map:
+			return true
+		case reflect.Struct:
+			return isStructOnePtr(firstField.Type)
+		}
+	}
+	return false
+}
+
 type sortableBindings []*Binding
 
 func (bindings sortableBindings) Len() int {

+ 19 - 0
jsoniter_interface_test.go

@@ -186,6 +186,25 @@ func Test_nested_one_field_struct(t *testing.T) {
 	should.Equal(`{"Me":{"Field":{"Field":{"Field":"abc"}}}}`, str)
 }
 
+func Test_struct_with_embedded_ptr_with_tag(t *testing.T) {
+	type O1 struct {
+		O1F string
+	}
+
+	type Option struct {
+		O1 *O1
+	}
+
+	type T struct {
+		Option `json:","`
+	}
+	var obj T
+	should := require.New(t)
+	output, err := MarshalToString(obj)
+	should.Nil(err)
+	should.Equal(`{"O1":null}`, output)
+}
+
 func Test_struct_with_one_nil(t *testing.T) {
 	type TestObject struct {
 		F *float64