Golang validator/v10如何验证嵌套切片元素的required_if规则?
问题
定义如下Go结构体用于接收请求参数并做校验:
type StorePromotion struct { BatchStair []*StairItem `json:"batch_stair" binding:"required,dive"` DiscountType string `json:"discount_type" binding:"required,oneof=amount discount"` } type StairItem struct { SubjectNum int8 `json:"subject_num" binding:"required"` Value int64 `json:"value" binding:"required"` Limit int64 `json:"limit" binding:"required_if=DiscountType discount"` }
其中基础的required标签校验正常,但StairItem中Limit字段的required_if标签未生效:当传入以下JSON(discount_type为discount但未传Limit)时,预期校验失败,实际未触发校验:
{ "discount_type": "discount", "batch_stair": [{ "subject_num": 2, "value": 100 }, { "subject_num": 2, "value": 90 } ] }
非嵌套结构体中的required_if可正常工作,需找到无需自定义校验方法的解决办法。
解决办法
问题出在嵌套结构体的字段引用上:在dive进入切片内的StairItem上下文后,无法直接通过DiscountType引用父结构体StorePromotion的字段,需要用..前缀表示访问父级上下文的字段。
修改StairItem中Limit字段的binding标签,将DiscountType改为..DiscountType即可:
type StairItem struct { SubjectNum int8 `json:"subject_num" binding:"required"` Value int64 `json:"value" binding:"required"` Limit int64 `json:"limit" binding:"required_if=..DiscountType discount"` }
修改后,当StorePromotion的DiscountType为discount时,batch_stair中的每个StairItem都会校验Limit字段是否存在,未传则触发校验失败。
内容的提问来源于stack exchange,提问作者Grocker
相关产品推荐
相关产品推荐

