如何将小写名称 JSON 解码到我的结构中?

Cod*_*ody 1 json http go

我开始疯狂地尝试让 Go 解码这个 json 请求正文。这是一个示例请求:

curl -X POST -d "{\"username\":\"foo\", \"password\":\"bar\"}" http://localhost:3000/users
Run Code Online (Sandbox Code Playgroud)

这是我的处理程序:

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:}
})
Run Code Online (Sandbox Code Playgroud)

就像评论所暗示的那样,我可以验证这req.Body确实是正确的 - 但无论出于何种原因,json.NewDecoder(req.Body).Decode(&body)永远不会填写 的字段body

任何帮助将不胜感激!

Not*_*fer 5

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

像这样重写它就会起作用:

 var body struct {
        Username string `json:"username"` 
        Password string `json:"password"`
 }
Run Code Online (Sandbox Code Playgroud)

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

但是如果你也使用该对象来编码 json,那么你就需要它,否则你会在生成的 json 中得到大写的字段名称。

您可以将 json 结构标签用于一些更有用的事情,例如从编码的 json 中省略空字段,或完全跳过字段。

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