Golang:验证字符串类型的结构字段为特定值之一

sam*_*ife 3 validation json struct go

戈兰版本:1.18.3

验证器:github.com/go-playground/validator/v10

我想在加载到嵌套结构数据结构后验证传入的 JSON 有效负载。这是我传入的 JSON 负载,

{
  "name": "Duro",
  "gender": "MALE",
  "tier": 3,
  "mobileNumber": "0356874586",
  "address": {
    "city": "Tokyo",
    "street": "Shibaura St"
  },
  "children":[
    {
      "title": "Mr",
      "lastName": "Takayashi"
    }
  ],
  "isEmployed": false,
  "requestedAt": "2022-01-10T03:30:12.639Z"
}
Run Code Online (Sandbox Code Playgroud)

这是我的 user.go 文件,

package main

type User struct {
        Name                   string                     `validate:"required"`
        Gender                 string                     `validate:"required,oneof=MALE FEMALE"`
        Tier                   *uint8                     `validate:"required,eq=0|eq=1|eq=2|eq=3"`
        MobileNumber           string                     `validate:"required"`
        Email                  string
        Address                *Address  `validate:"required"`
        Children               []Child   `validate:"required,dive"`
        IsEmployed             *bool     `validate:"required"`
        PreferredContactMethod string    `validate:"oneof=EMAIL PHONE POST SMS"`
        RequestedAt            time.Time `validate:"required"`
    }
    type Address struct {
        City   string `validate:"required"`
        Street string `validate:"required"`
    }
    
    type Child struct {
        Title     string `validate:"required"`
        FirstName string
        LastName  string `validate:"required"`
    }
Run Code Online (Sandbox Code Playgroud)

这是我的测试功能

func TestUserPayload(t *testing.T) {
    validate := validator.New()
    var u User

    err := json.Unmarshal([]byte(jsonData), &u)
    if err != nil {
        panic(err)
    }

    err := validate.Struct(&u)
    if err != nil {
        t.Errorf("error %v", err)
    }

}
Run Code Online (Sandbox Code Playgroud)

此测试因错误而失败,

error Key: 'User.PreferredContactMethod' Error:Field validation for 'PreferredContactMethod' failed on the 'oneof' tag
Run Code Online (Sandbox Code Playgroud)

发生这种情况是因为 Go 将空字符串分配给 User.PreferredContactMethod 结构体字段。由于PreferredContactMethod不是必填字段,因此当 json 有效负载没有该字段时,我不想看到此验证错误。当 json 负载没有preferredContactMethod字段时,如何避免此错误消息?

如果您有更好的选择来实现此验证,也很高兴听到它们。

这是Go Playground 中的代码

pey*_*cas 8

使用omitempty使oneof验证器库忽略空或未设置的值。

type User struct {
        Name                   string                     `validate:"required"`
        Gender                 string                     `validate:"required,oneof=MALE FEMALE"`
        Tier                   *uint8                     `validate:"required,eq=0|eq=1|eq=2|eq=3"`
        MobileNumber           string                     `validate:"required"`
        Email                  string
        Address                *Address  `validate:"required"`
        Children               []Child   `validate:"required,dive"`
        IsEmployed             *bool     `validate:"required"`
        PreferredContactMethod string    `validate:"omitempty,oneof=EMAIL PHONE POST SMS"`
        RequestedAt            time.Time `validate:"required"`
    }

Run Code Online (Sandbox Code Playgroud)