dqwh1205 2018-06-18 07:40
浏览 101
已采纳

动态创建某种类型的结构并将其解编成JSON

I am creating a struct instance at runtime. The instance has been created successfully, but I can't unmarshal JSON into it.

type Test struct {
    Name string `json:"name,omitempty"`
}

func create(a interface{}) {
    aType := reflect.TypeOf(a).Elem()
    elType := aType.Elem()

    f := reflect.Indirect(reflect.New(elType))

    b := []byte(`{"name": "go"}`)

    err := json.Unmarshal(b, &f)
    fmt.Println(err, f)
}

func main() {
    l := []Test{}
    create(&l)
}
  • 写回答

3条回答 默认 最新

  • douxun2023 2018-06-18 07:48
    关注

    reflect.Indirect() returns you a value of type reflect.Value, and you should pass a pointer to Test (which is of type *Test) to json.Unmarshal().

    Simply use the Value.Interface() method to obtain the pointer to your Test struct returned by reflect.New(), like this:

    f := reflect.New(elType).Interface()
    b := []byte(`{"name": "go"}`)
    err := json.Unmarshal(b, f)
    

    With this it works, and output will be:

    <nil> &{go}
    

    Note that f will be of interface{} type, holding the *Test pointer value. If you need the struct value, you may use type assertion, like this:

    t := *f.(*Test)
    fmt.Println(t)
    

    This prints:

    {go}
    

    Try the examples on the Go Playground.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 php 将rtmp协议转hls协议,无法播放
  • ¥15 miniconda安装不了
  • ¥20 python代码编写
  • ¥20 使用MPI广播数据遇到阻塞
  • ¥15 TinyMCE如何去掉自动弹出的“链接…”工具?
  • ¥15 微信支付转账凭证,如何解决
  • ¥15 在win10下使用指纹登录时,界面上的文字最后一个字产生换行现象
  • ¥20 使用AT89C51微控制器和MAX7219驱动器来实现0到99秒的秒表计数,有开始和暂停以及复位功能,下面有仿真图,请根据仿真图来设计c语言程序
  • ¥15 51单片机 双路ad同步采样
  • ¥15 使用xdocreport 生成word