go struct JSON decode总是空返回& {}

时间:2016-01-23 22:35:27

标签: go

我的处理程序中可能出错了什么?

type Patient struct {
    FirstName string
    LastName  string
}


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

    r.ParseForm()
    p := new(Patient)
    err := json.NewDecoder(r.Body).Decode(&p)

    if err != nil && err != io.EOF {
        log.Fatal(err)
    }

    log.Print(p)
}

我总是来自curl -X POST $PATH -d '{"firstName": "Julian"}'

2016/01/23 17:33:50 &{  }

修改

我已添加fmt.Println(r)并获得此

2016/01/23 18:33:22 &{POST /patients/ HTTP/1.1 1 1 map[Accept:[*/*] Content-Type:[application/json] User-Agent:[curl/7.46.0]] 0x9b2820 0 [] false localhost:8081 map[] map[] <nil> map[] [::1]:35394 /patients/ <nil> <nil>}

调试上一行后,我发现它是gorilla toolkit子路由器的问题

2 个答案:

答案 0 :(得分:1)

两件事:

由于您使用的是JSON lib约定,因此您的帖子表单数据应为FirstName而不是firstName。如果您真的想使用firstName,则需要将此结构标记添加到字段:json:"firstName"

接下来,您不再需要将&放入&p,因为new(Patient)已经返回指针。只需添加p

虽然就个人而言,我只是做p := Patient{},所以我知道它不是指针并且在解码器中使用&p

答案 1 :(得分:0)

您必须删除r.ParseForm。你可以在这里阅读

https://golang.org/pkg/net/http/#Request.ParseForm

  

对于POST或PUT请求,它还会解析请求正文

因此,在调用ParseForm之后,您的请求正文将为空,您将收到一个空结构。