JSON解码器无法处理http请求体

时间:2015-02-21 10:14:59

标签: json http go

我开始疯狂试图让Go解码这个json请求体。这是一个示例请求:

curl -X POST -d "{\"username\":\"foo\", \"password\":\"bar\"}" http://localhost:3000/users

这是我的经纪人:

mux.HandleFunc("/users", func(rw http.ResponseWriter, req *http.Request) {
        var body struct {
            username string
            password string
        }

        // buf := make([]byte, req.ContentLength)
        // req.Body.Read(buf)
        // fmt.Println(string(buf))
        //
        // The above commented out code will correctly print:
        // {"username":"foo", "password":"bar"}

        err := json.NewDecoder(req.Body).Decode(&body)
        if err != nil {
            rw.WriteHeader(http.StatusNotAcceptable)
            return
        }

        fmt.Printf("%+v\n", body)
        // prints -> {username: password:}
})

与评论建议一样,我可以验证req.Body确实是正确的 - 但无论出于何种原因,json.NewDecoder(req.Body).Decode(&body)都不会填写body的字段。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:4)

问题是json解码器不处理私有struct字段。 body结构中的字段是私有的。

像这样重写它会起作用:

 var body struct {
        Username string `json:"username"` 
        Password string `json:"password"`
 }

基本上json:"username"是一种告诉json解码器如何将对象的json名称映射到结构名称的方法。在这种情况下,仅用于解码,没有必要 - json解码器足够智能以进行大/小写的转换。

但是如果您使用该对象来编码json,则需要它,或者您将在生成的json中使用大写字段名称。

你可以使用json struct标签来做一些更有用的事情,比如从编码的json中省略空字段,或者完全跳过字段。

您可以在json.Marshal的文档中阅读有关JSON结构标记的更多信息:http://golang.org/pkg/encoding/json/#Marshal