json.NewDecoder(r.Body).Decode(&admin) 返回空结构 [关闭]

Posted

技术标签:

【中文标题】json.NewDecoder(r.Body).Decode(&admin) 返回空结构 [关闭]【英文标题】:json.NewDecoder(r.Body).Decode(&admin) returns empty struct [closed] 【发布时间】:2021-06-25 12:56:28 【问题描述】:

我知道有很多人遇到了同样的问题,但我仍然在这里。我很确定我的代码是正确的,但结果结构仍然是空的。 功能:

func PostAdminHandler(w http.ResponseWriter, r *http.Request) 
    w.Header().Set("Content-type", "application/json")
    var admin admin.Admin

    json.NewDecoder(r.Body).Decode(&admin)
    fmt.Println(admin)
    _, err := PostAdmin(admin)
    if err != nil 
        http.Error(w, err.Error(), http.StatusInternalServerError)
    

控制台打印:

     ObjectID("000000000000000000000000")

结构:

package entity

import "go.mongodb.org/mongo-driver/bson/primitive"

type Admin struct 
    FirstName string
    LastName  string
    Email     string
    Password  string
    Role      string
    Campus    primitive.ObjectID

路线:

    adminRoute.HandleFunc("/admin", admin.PostAdminHandler).Methods("POST")

我通过 Insomnia 发送的 Json 数据:


    "FirstName": "Jeanne",
    "LastName": "Darc",
    "Email": "jeanne.darc@rouen.fr",
    "Password": "JeanneDarc2022",
    "Role": "admin",
    "Campus": "60d5a25ff4d722d3b77d1929",

我从解码器得到的错误:

invalid character '' looking for beginning of object key string

【问题讨论】:

检查来自Decoder.Decode的错误 是的,对不起,我忘了说。在这里:invalid character '' looking for beginning of object key string 去掉输入中“Campus”后面的最后一个逗号 没有。 RFC 将语法指定为:object = begin-object [ member *( value-separator member ) ] end-object 作为一般规则,不忽略函数调用返回的错误是值得的 【参考方案1】:

本 RFC:

https://datatracker.ietf.org/doc/html/rfc7159

将 JSON 对象格式指定为:

对象结构表示为一对花括号 围绕零个或多个名称/值对(或成员)。名字就是一个 细绳。每个名称后都有一个冒号,用于分隔名称 从价值。 单个逗号将值与后面的值分开名称。对象中的名称应该是唯一的。

object = begin-object [ member *( value-separator member ) ]
               end-object

member = string name-separator value

所以,没有尾随逗号。

删除输入中的最后一个逗号。

【讨论】:

以上是关于json.NewDecoder(r.Body).Decode(&admin) 返回空结构 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Golang 将 form-urlencoded 序列化为对象

golang里json的处理配合struct是相当方便

按结果优化查询顺序以使用文件排序;

go限制上传文件大小

将原始 []byte 视频传输到 ffmpeg - Go

5阶m序列