为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 ShouldBindJSON() 中使用 struct 的一部分?

如何在 ShouldBindJSON() 中使用 struct 的一部分?

Go
慕哥9229398 2022-10-17 10:24:16
我正在使用带有 Gin 的 Go 1.17。这是我的结构:package modeltype Movie struct {    ID         string `json:"id"`    Year       uint16 `json:"year" binding:"required,lt=3000"`    RentNumber uint32 `json:"rent_number" db:"rent_number" binding:"required,lt=4294967290"`    Title      string `json:"title" binding:"required,max=255"`    Author     string `json:"author" binding:"required,max=80"`    Editor     string `json:"editor" binding:"required,max=125"`    Index      string `json:"index" binding:"required,max=125"`    Bib        string `json:"bib" binding:"required,max=20"`    Ref        string `json:"ref" binding:"required,max=20"`    Cat1       string `json:"cat_1" db:"cat_1" binding:"required,max=20"`    Cat2       string `json:"cat_2" db:"cat_2" binding:"required,max=10"`}我在某个处理程序中使用此结构时遇到问题。在这个处理程序中,我只需要使用我的电影结构中的 2 个属性(标题和年份)。如果我正在做这样的事情:func (h *Handler) myHandler(c *gin.Context) {    var movie model.Movie    if err := c.ShouldBindJSON(&movie); err != nil {        c.Error(err)        c.Abort()        return    }    ...它不起作用,因为在此 Web 服务上我将只发送 2 个属性,并且我将从绑定标签中获得所需的错误:{    "title": My title",    "year": 2017}所以我想知道处理这个问题的“方法”是什么?我可以看到 3 个解决方案。使用电影结构并忽略除Titleand之外的所有字段Year,但我该怎么做呢?仅使用所需字段创建特定结构。在这种情况下,我不会将此结构放在模型包中,而是放在我的电影 api 包中 type StructForTheSpecialHandler struct {    Year       uint16 `json:"year" binding:"required,lt=3000"`    Title      string `json:"title" binding:"required,max=255"` }像这样直接在我的处理程序中创建结构:func (h *Handler) myHandler(c *gin.Context) {   var tmp struct {       Year  uint16 `json:"year" binding:"required,lt=3000"`       Title string `json:"title" binding:"required,max=255"`   }   if err := c.ShouldBindJSON(&tmp); err != nil {       c.Error(err)       c.Abort()       return   }   ...你能告诉我你是否有更好的解决方案,或者告诉我我的 3 个解决方案之间的正确方法是什么?
查看完整描述

1 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

您可以直接解组它(完全绕过验证):


err := json.NewDecoder(c.Request.Body).Decode(&movie)

或者您可以尝试将这些属性嵌入到结构中:


type EmbeddedMovieFields struct {

   Year  uint16 `json:"year" binding:"required,lt=3000"`

   Title string `json:"title" binding:"required,max=255"`

}


type Movie struct {

    EmbeddedMovieFields

    ID         string `json:"id"`

    RentNumber uint32 `json:"rent_number" db:"rent_number" binding:"required,lt=4294967290"`

    Author     string `json:"author" binding:"required,max=80"`

    Editor     string `json:"editor" binding:"required,max=125"`

    Index      string `json:"index" binding:"required,max=125"`

    Bib        string `json:"bib" binding:"required,max=20"`

    Ref        string `json:"ref" binding:"required,max=20"`

    Cat1       string `json:"cat_1" db:"cat_1" binding:"required,max=20"`

    Cat2       string `json:"cat_2" db:"cat_2" binding:"required,max=10"`

}


var movie model.EmbeddedMovieFields


if err := c.ShouldBindJSON(&movie); err != nil {

    c.Error(err)

    c.Abort()

    return

}


查看完整回答
反对 回复 2022-10-17
  • 1 回答
  • 0 关注
  • 210 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号