当请求主体是golang gin的对象数组时,绑定验证不起作用

时间:2019-10-28 02:17:01

标签: go gin

当请求正文(JSON)表示对象数组时,金酒的请求验证功能不起作用

例如:

[ 
   { 
      "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)

更清楚地说,杜松子酒中的验证逻辑期望根对象是一个结构,因此在传递数组类型时无法使用。

验证体内传递的数组中的每个对象的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

将先here解析JSON,然后here进行验证。

对默认ValidateStruct方法的评论:

  

ValidateStruct可以接收任何类型的类型,但只能执行struct或指向该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接口。