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

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

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

Go
Smart猫小萌 2023-01-03 11:27:57
高朗版本: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"}这是我的 user.go 文件,package maintype 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"`    }这是我的测试功能func TestUserPayload(t *testing.T) {    validate := validator.New()    var u User此测试因错误而失败,error Key: 'User.PreferredContactMethod' Error:Field validation for 'PreferredContactMethod' failed on the 'oneof' tag发生这种情况是因为 Go 将空字符串分配给 User.PreferredContactMethod 结构字段。因为PreferredContactMethod不是必填字段,所以当 json 有效负载没有它时,我不想看到这个验证错误。当 json 有效负载没有preferredContactMethod字段时,如何避免出现此错误消息?如果您有更好的替代方案来实现此验证,也很高兴听到它们。这是Go Playground 中的代码
查看完整描述

2 回答

?
慕码人2483693

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

与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"`

    }


查看完整回答
反对 回复 2023-01-03
?
HUWWW

TA贡献1874条经验 获得超12个赞

使用https://github.com/marrow16/valix ( https://pkg.go.dev/github.com/marrow16/valix ) 可以通过以下方式实现:


package main


import (

    "fmt"

    "time"


    "github.com/marrow16/valix"

)


type User struct {

    Name                   string    `json:"name" v8n:"required, notNull"`

    Gender                 string    `json:"gender" v8n:"required, notNull, &strtoken{['MALE','FEMALE']}"`

    Tier                   uint8     `json:"tier" v8n:"required, notNull, &mini{0}, &maxi{3}"`

    DateOfBirth            string    `json:"dateOfBirth" v8n:"notNull, &strisod"`

    MobileNumber           string    `json:"mobileNumber" v8n:"required, notNull, &strpatt{'^([0-9]{8,16})$'}"`

    Email                  string    `json:"email" v8n:"notNull"`

    Address                Address   `json:"address" v8n:"required, notNull"`

    Children               []Child   `json:"children" v8n:"required, notNull"`

    IsEmployed             bool      `json:"isEmployed" v8n:"required"`

    PreferredContactMethod string    `json:"preferredContactMethod" v8n:"notNull, &strtoken{['EMAIL','PHONE','POST','SMS']}"`

    RequestedAt            time.Time `json:"requestedAt" v8n:"required, notNull, &strisodt"`

}

type Address struct {

    City   string `json:"city" v8n:"required, notNull"`

    Street string `json:"street" v8n:"required, notNull"`

}


type Child struct {

    Title     string `json:"title" v8n:"required, notNull"`

    FirstName string `json:"firstName" v8n:"notNull"`

    LastName  string `json:"lastName" v8n:"required, notNull"`

}


const jsonData = `{

  "name": "Duro",

  "gender": "MALE",

  "tier": 3,

  "dateOfBirth": "2000-01-13",

  "mobileNumber": "0356874586",

  "address": {

    "city": "Tokyo",

    "street": "Shibaura St"

  },

  "children":[

    {

      "title": "Mr",

      "lastName": "Takayashi"

    }

  ],

  "isEmployed": false,

  "requestedAt": "2022-01-10T03:30:12.639Z"

}`


var UserRequestValidator = valix.MustCompileValidatorFor(User{}, nil)


func main() {

    user := User{}


    ok, violations, _ := UserRequestValidator.ValidateStringInto(jsonData, &user)


    if ok {

        fmt.Println("Validation successful")

    } else {

        fmt.Println(fmt.Sprintf("Validation failed! (violations: %d)", len(violations)))

        for _, v := range violations {

            fmt.Printf("%s (property: '%s', path: '%s')\n", v.Message, v.Property, v.Path)

        }

    }

}

在这里去游乐场:https ://go.dev/play/p/3zrkZx97m-e


披露:我是 Valix 的作者


查看完整回答
反对 回复 2023-01-03
  • 2 回答
  • 0 关注
  • 185 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

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

帮助反馈 APP下载

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

公众号

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