dynamic-struct icon indicating copy to clipboard operation
dynamic-struct copied to clipboard

Support embedded dynamic struct

Open leslie-qiwa opened this issue 4 years ago • 1 comments

Thanks for making this great tool. It is very useful for GraphQL query which requires dynamic struct sometimes.

One feature seems missing is not supported embedded dynamic struct. For example,

func main() {
  childStruct := dynamicstruct.NewStruct().
    AddField("Child", 0, `json:"int"`).
    Build()

  childInstance := childStruct.New()
  content, err := json.Marshal(childInstance)
  if err != nil {
    log.Fatal(err)
  }
  fmt.Println(string(content))

  parentStruct := dynamicstruct.NewStruct().
    AddField("Parent", &childInstance, "").Build()

  parentInstance := parentStruct.New()
  content, err = json.Marshal(parentInstance)
  if err != nil {
    log.Fatal(err)
  }

  fmt.Println(string(content))
}

Result will be:

{"int":0}
{"Parent":null}

Seems like this is due to embedded dynamic struct instance is not initialized, so if explicitly init like below, it will marshal correctly

func main() {
        childStruct := dynamicstruct.NewStruct().
                AddField("Child", 0, `json:"int"`).
                Build()

        childInstance := childStruct.New()
        content, err := json.Marshal(childInstance)
        if err != nil {
                log.Fatal(err)
        }
        fmt.Println(string(content))

        parentStruct := dynamicstruct.NewStruct().
                AddField("Parent", &childInstance, "").Build()

        parentInstance := parentStruct.New()

                data := []byte(`
                {
                        "Parent": {
                          "Child": 0
                        }
                }
                `)

                err = json.Unmarshal(data, &parentInstance)
                if err != nil {
                        log.Fatal(err)
                }

        content, err = json.Marshal(parentInstance)
        if err != nil {
                log.Fatal(err)
        }

        fmt.Println(string(content))
}

Marshal result is

{"int":0}
{"Parent":{"Child":0}}

leslie-qiwa avatar Oct 29 '21 21:10 leslie-qiwa

See #21

mtt0 avatar Jun 14 '22 08:06 mtt0

This is still not working

PBholewasi avatar Nov 09 '22 18:11 PBholewasi