为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 Golang 验证 JSON 输入?

如何使用 Golang 验证 JSON 输入?

Go
ibeautiful 2023-06-19 17:21:43
我正在使用 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 将立即崩溃。我也希望能够验证类型。
查看完整描述

4 回答

?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

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

查看完整回答
反对 回复 2023-06-19
?
杨魅力

TA贡献1811条经验 获得超5个赞

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



查看完整回答
反对 回复 2023-06-19
?
开心每一天1111

TA贡献1836条经验 获得超13个赞

我今天必须这样做,所以我将分享我的解决方案。我使用 unmarshal 创建了一个函数,它根据文本是否返回有效的 json 返回 true 或 false:


// isJSON checks that the string value of the field can unmarshall into valid json

func 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 json

func 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)


查看完整回答
反对 回复 2023-06-19
?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

有一种方法checkValid(在encoding/json包中)可以做到这一点。但是,此方法未公开。因此,您可以使用Unmarshal(在同一个包中)来检查是否JSON有效。



查看完整回答
反对 回复 2023-06-19
  • 4 回答
  • 0 关注
  • 120 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信