为了账号安全,请及时绑定邮箱和手机立即绑定

从 Go 将 json 转换为结构时出错

从 Go 将 json 转换为结构时出错

Go
子衿沉夜 2022-09-26 15:35:50
 func MakeMap(w http.ResponseWriter, r *http.Request) {    // userInfo := context.Get(r, "userInfo").(model.User)    type _getData struct {        Title string   `json:"title"`        Tag   []string `json:"tag"`    }    var getData _getData    err := json.NewDecoder(r.Body).Decode(&getData)    if err != nil {        panic(err.Error())    }    fmt.Print(getData)}当我运行上面的代码时,我得到以下错误2021/08/24 13:56:54 http: panic serving 127.0.0.1:50619: runtime error: invalid memory address or nil pointer dereferencegoroutine 23 [running]:net/http.(*conn).serve.func1(0x140001e9180)        /usr/local/go/src/net/http/server.go:1824 +0x108panic(0x10505b860, 0x10522f240)        /usr/local/go/src/runtime/panic.go:971 +0x3f4traveling/controller/mapController.MakeMap(0x1050b5630, 0x140001f40e0, 0x1400018aa00)/Users/choeyunseog/traveling/traveling/controller/mapController/mapController.go:20 +0x3c我刚刚开始学习,我不确定为什么我有这个问题,请帮忙在此处输入图像描述err := json.NewDecoder(r.Body).Decode(&getData) 当我像上面一样更改代码行20时,我收到以下错误 2021/08/24 14:16:44 http: panic serving 127.0.0.1:51396: invalid character '-' in numeric literalgoroutine 23 [running]:net/http.(*conn).serve.func1(0x140001e9360)        /usr/local/go/src/net/http/server.go:1824 +0x108panic(0x100d85d00, 0x14000206070)        /usr/local/go/src/runtime/panic.go:971 +0x3f4traveling/controller/mapController.MakeMap(0x100df1630, 0x140001f40e0, 0x1400018aa00)        /Users/choeyunseog/traveling/traveling/controller/mapController/mapController.go:24 +0x194net/http.HandlerFunc.ServeHTTP(0x100de75d8, 0x100df1630, 0x140001f40e0, 0x1400018aa00)        /usr/local/go/src/net/http/server.go:2069 +0x40
查看完整描述

2 回答

?
HUH函数

TA贡献1836条经验 获得超4个赞

要从 POST/PUT/PATCH 请求的正文获取多部分表单数据,可以使用解析多部分表单方法来解析正文,然后通过 PostForm 字段访问数据。或者,您可以使用 FormValue 仅获取与表单字段关联的第一个值。

maxMemory := 32<<20

if err := r.ParseMultipartForm(maxMemory); err != nil {

    panic(err)

}


fmt.Println(_getData{

    Title: r.FormValue("title"), // FormValue returns string

    Tag:   r.PostForm["tag[]"],  // PostForm is a map of []string

})


查看完整回答
反对 回复 2022-09-26
?
跃然一笑

TA贡献1826条经验 获得超6个赞

您可以使用包 github.com/senpathi/paramex 将表单数据解析为 json,如带注释的结构。结构字段必须使用关键字进行注释,并且标记名称是表单数据的键。param


您的结构应如下所示。


type _getData struct {

        Title string   `param:"title"`

        Tag   []string `param:"tag[]"`

    }

这是问题中提到的邮递员请求的更新的 MakeMap 处理程序函数


func MakeMap(w http.ResponseWriter, r *http.Request) {

    // userInfo := context.Get(r, "userInfo").(model.User)

    type _getData struct {

        Title string   `param:"title"`

        Tag   []string `param:"tag[]"`

    }


    // this needed because u send data from Postman as multipart/form-data

    maxMemory := 32<<20

    if err := r.ParseMultipartForm(int64(maxMemory)); err != nil {

        panic(err)

    }


    var getData _getData


    extractor := paramex.NewParamExtractor()

    err := extractor.ExtractForms(&getData, r)

    if err != nil {

        panic(err.Error())

    }


    fmt.Print(getData)

    //Output: {defaultMap [travelling travelling2]}

}


查看完整回答
反对 回复 2022-09-26
  • 2 回答
  • 0 关注
  • 135 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信