【问题标题】:Error while converting json to struct from Go从 Go 将 json 转换为 struct 时出错
【发布时间】:2021-10-24 08:40:17
【问题描述】:
 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 dereference
goroutine 23 [running]:
net/http.(*conn).serve.func1(0x140001e9180)
        /usr/local/go/src/net/http/server.go:1824 +0x108
panic(0x10505b860, 0x10522f240)
        /usr/local/go/src/runtime/panic.go:971 +0x3f4
traveling/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 literal
goroutine 23 [running]:
net/http.(*conn).serve.func1(0x140001e9360)
        /usr/local/go/src/net/http/server.go:1824 +0x108
panic(0x100d85d00, 0x14000206070)
        /usr/local/go/src/runtime/panic.go:971 +0x3f4
traveling/controller/mapController.MakeMap(0x100df1630, 0x140001f40e0, 0x1400018aa00)
        /Users/choeyunseog/traveling/traveling/controller/mapController/mapController.go:24 +0x194
net/http.HandlerFunc.ServeHTTP(0x100de75d8, 0x100df1630, 0x140001f40e0, 0x1400018aa00)
        /usr/local/go/src/net/http/server.go:2069 +0x40

【问题讨论】:

  • 谢谢,你说的我已经更正了
  • 你能打印wr并更新问题吗
  • 邮递员显示您正在传递 form-data 但您尝试将正文解析为 json。
  • 如你所说,我改了代码,结果却是空的
  • 因为你没有发送 JSON。您正在发送form-data。 JSON 和表单数据不是一回事。

标签: mysql go gorilla mux


【解决方案1】:

您可以使用包github.com/senpathi/paramex 将表单数据解析为带注释结构的json。 struct字段必须用param关键字注解,标签名是表单数据的key。

你的结构应该如下。

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]}
}

【讨论】:

    【解决方案2】:

    要从 POST/PUT/PATCH 请求的正文中获取多部分表单数据,您可以使用 ParseMultipartForm 方法解析正文,然后通过 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
    })
    

    【讨论】:

    • 我尝试输入 _getData struct { Title string json:"title" Tag []string json:"tag" } var getData _getData getData.Tag = r.FormValue("tag[]") 并得到这样的错误不能使用 r.FormValue("tag[]") (字符串类型的值) 作为赋值中的 []string 值
    • 我知道,我想要的是,当在邮递员中发送多个标签[]之类的信息时,我想知道如何在golang中将这些数据作为数组接收
    • 谢谢,所有问题都解决了,但是 var getData _getData getData.Tag = r.PostForm["tag[]"] getData.Title = r.FormValue("title") 当我像这样使用它下面,我没有收到数组值,是什么原因?
    • 我没有写关于 r.ParseForm() 的文章,真的很抱歉,但你能给我看一个简单的例子来说明如何使用 r.ParseForm() 真的很抱歉跨度>
    • type _getData struct { Title string json:"title" Tag []string json:"tag" } if err := r.ParseForm(); err != nil { panic(err) } var getData _getData getData.Tag = r.PostForm["tag[]"] getData.Title = r.FormValue("title") fmt.Print(getData)
    猜你喜欢
    • 2018-08-16
    • 2013-04-14
    • 2019-08-13
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-14
    • 1970-01-01
    相关资源
    最近更新 更多