当请求主体是对象数组时,绑定验证不起作用
Binding validations does not work when request body is Array of objects
当请求正文 (JSON) 表示对象数组时,Gin 的请求验证功能不起作用
例如:
[
{
"field1":"aaa",
"field2":"bbb"
}
]
代码:
type item struct {
Field1 string `json:"field1" binding:"required"`
Field2 string `json:"field2" binding:"required"`
}
var items []item
err := c.BindJSON(&items)
更清楚地说,gin 中的验证逻辑期望根对象是一个结构,因此在传递数组类型时会退出。
验证正文中传递的数组中每个对象的最佳方法是什么?
JSON 将被解析为 here and then validated here。
默认ValidateStruct方法的注释:
ValidateStruct receives any kind of type, but only performed struct or pointer to struct type.
您可以根据需要定义一个保存数据的结构来解决此问题:
type itemHolder struct {
Items []item
}
然后定义自定义 Unmarshaler,像这样:
func (i *itemHolder) UnmarshalJSON(b []byte) error {
return json.Unmarshal(b, &i.Items)
}
现在*itemHolder
实现了json.Unmarshaler
,这意味着它将是gin支持的结构。
这段代码现在应该可以工作了:
var items itemHolder
err := c.BindJSON(&items)
if err != nil {
// handle...
}
// use items.Items from here on
请注意,您的元帅行为将会改变;因此,如果需要,您绝对应该实现 Marshaler 接口。
当请求正文 (JSON) 表示对象数组时,Gin 的请求验证功能不起作用
例如:
[
{
"field1":"aaa",
"field2":"bbb"
}
]
代码:
type item struct {
Field1 string `json:"field1" binding:"required"`
Field2 string `json:"field2" binding:"required"`
}
var items []item
err := c.BindJSON(&items)
更清楚地说,gin 中的验证逻辑期望根对象是一个结构,因此在传递数组类型时会退出。
验证正文中传递的数组中每个对象的最佳方法是什么?
JSON 将被解析为 here and then validated here。
默认ValidateStruct方法的注释:
ValidateStruct receives any kind of type, but only performed struct or pointer to struct type.
您可以根据需要定义一个保存数据的结构来解决此问题:
type itemHolder struct {
Items []item
}
然后定义自定义 Unmarshaler,像这样:
func (i *itemHolder) UnmarshalJSON(b []byte) error {
return json.Unmarshal(b, &i.Items)
}
现在*itemHolder
实现了json.Unmarshaler
,这意味着它将是gin支持的结构。
这段代码现在应该可以工作了:
var items itemHolder
err := c.BindJSON(&items)
if err != nil {
// handle...
}
// use items.Items from here on
请注意,您的元帅行为将会改变;因此,如果需要,您绝对应该实现 Marshaler 接口。