go - 当请求正文是对象数组时,绑定(bind)验证不起作用

标签 go go-gin

当请求正文 (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然后验证 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

请注意,您的编码(marshal)行为会发生变化;所以你绝对应该实现 Marshaler如果需要,可以使用界面。

关于go - 当请求正文是对象数组时,绑定(bind)验证不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58585078/

相关文章:

go - 为什么 goroutine 中的 fmt.Println 不打印一行?

go - 为什么 'go vet' 只在某些版本的 Go 中报错?

go - 如果条件为假,如何停止 golang 中的 cron 作业?

处理程序中的 Golang 抽象以避免代码重复

go - 在 gin 路由器中使用现有的 session cookie

arrays - 如何使用分隔符对字符串进行 slice

unit-testing - API中的测试覆盖率

json - 如何从 Gin 中发布的 JSON 中获取特定参数?

postgresql - pq : password authentication failed for user "user-name" while accessing postgres in vscode

Golang猴子补丁