猿问

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

我正在使用带有 Gin 的 Go 1.17。这是我的结构:


package model


type 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 个解决方案之间的正确方法是什么?


慕哥9229398
浏览 211回答 1
1回答

慕码人2483693

您可以直接解组它(完全绕过验证):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.EmbeddedMovieFieldsif err := c.ShouldBindJSON(&movie); err != nil {    c.Error(err)    c.Abort()    return}
随时随地看视频慕课网APP

相关分类

Go
我要回答