Golang Gin中binding:"required,dive"验证不生效问题
问题分析与解决
当前问题出在Messages数组内的Text字段未添加必填验证标签,导致Gin绑定器在JSON缺失text字段时,仅会将Text初始化为零值结构体,不会触发校验错误。
解决方案
给Text字段添加binding:"required"标签;如果需要确保Body字段也为必填项,同时给Body加上binding:"required":
type TextMessage struct { Contacts []struct { Profile struct { Name string `json:"name"` } `json:"profile"` WaID string `json:"wa_id"` } `json:"contacts" binding:"required,dive"` Messages []struct { From string `json:"from"` ID string `json:"id"` Timestamp string `json:"timestamp"` Text struct { Body string `json:"body" binding:"required"` // 若Body必填则添加该标签 } `json:"text" binding:"required"` // 核心:添加required标签触发校验 Type string `json:"type"` } `json:"messages" binding:"required,dive"` }
原理说明
Gin的binding.JSON校验规则逻辑:
- 无
required标签的字段,JSON中缺失时会自动用零值填充,不判定为错误 - 带有
required标签的字段,JSON中必须存在对应键值,否则绑定过程会返回校验错误
修改后,当传入的JSON不含text字段时,c.ShouldBindBodyWith会返回非nil错误,符合预期的校验逻辑。
内容的提问来源于stack exchange,提问作者GurbaniX
相关产品推荐
相关产品推荐

