如何使用 Golang 验证 JSON 输入?

我正在使用 Beego 框架在 Go 中构建 Web 应用程序。我必须验证 API 请求中传入的 JSON。

我可以将 JSON 解组为一个工作正常的结构,但我也想验证数据。例如,如果类型与 struct json 中的类型不匹配。Unmarshal 将在第一次出现时返回错误。我想一次验证并获取 JSON 的所有错误。

我试过了https://github.com/thedevsaddam/govalidator,但是包需要引用请求对象,这在 Beego 的控制器中不可用。还有其他验证器可以验证结构,但我也想要 json 验证。

编辑:

可以从控制器的上下文对象中找到对 beego 中请求对象的引用,如下所示:

func (this *MainController) Post() {
    fmt.Println(this.Ctx.Request)
}

问题仍然与 json unmarshal 相同。如果类型有任何轻微的不匹配,json.unmarshal 将立即崩溃。我也希望能够验证类型。


ibeautiful
浏览 158回答 4
4回答

幕布斯7119047

由于 Golang v1.9json.Valid([]byte)已经是“encoding/json”包中可用的有效方法。

杨魅力

我们出于类似目的使用了go-playground/validator.v8 。您可以使用开箱即用的标签定义数据验证(基本内容,例如相等性、最小值/最大值,甚至还有一些表达式语言)。最重要的是,您可以添加自定义验证。文档里都有,希望对你有帮助。

开心每一天1111

我今天必须这样做,所以我将分享我的解决方案。我使用 unmarshal 创建了一个函数,它根据文本是否返回有效的 json 返回 true 或 false:// isJSON checks that the string value of the field can unmarshall into valid jsonfunc isJSON(s string) bool {    var j map[string]interface{}    if err := json.Unmarshal([]byte(s), &j); err != nil {        return false    }    return true}然后我将该逻辑与验证程序包一起使用来创建和注册一个自定义验证标记,我可以在任何结构中使用它来验证字段是否包含 json。您可以使用go playground检查完整的解决方案和实验:// isJSON checks that the string value of the field can unmarshall into valid jsonfunc isJSON(fl validator.FieldLevel) bool {    var j map[string]interface{}    if err := json.Unmarshal([]byte(fl.Field().String()), &j); err != nil {        return false    }    return true}// register the function with json tag:validate.RegisterValidation("json", isJSON)

梵蒂冈之花

有一种方法checkValid(在encoding/json包中)可以做到这一点。但是,此方法未公开。因此,您可以使用Unmarshal(在同一个包中)来检查是否JSON有效。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go