我正在使用 Beego 开发 Web 服务器。我曾经beego.Controller处理过 POST 请求。在我的例子中,POST 请求包含一个 JSON:{ "name": "titi", "password": "123456"}这是我的代码:type TestController struct { beego.Controller}type User struct { Name string `json:"name"` Password string `json:"password"`}func (c *TestController) Post() { var ob md.User var err error if err = json.Unmarshal(c.Ctx.Input.RequestBody, &ob); err == nil { logs.Debug(ob.Name) logs.Debug(len(ob.Name)) } else { logs.Error("illegal JSON") }}这段代码工作正常。在 struct 的标签的帮助下User,"name"被分配给ob.Name和"password"被分配给ob.Password.现在,我想测试一些异常情况。例如,如果 JSON 请求不包含预期的键怎么办:{ "illegalKey1": "titi", "illegalKey2": "123456"}如您所见,我期待"name"and"password"但现在键变为"illegalKey1"and "illegalKey2"。所以我认为这可能会导致一些错误。令我惊讶的是,没有任何错误,因为err == nil它仍然是正确的,len(ob.Name)现在只是变成了 0。那么在 Go/Beego 中是否有一些好的方法来处理这种情况?我的意思是,我知道if len(ob.Name) == 0 { logs.Error("illegal JSON")}没关系,但我想知道是否有某种更漂亮的代码?否则,如果 JSON 中有 10 个字段,我必须这样做if10 次。显然,这根本不好。
1 回答
牧羊人nacy
TA贡献1862条经验 获得超7个赞
为了确保 JSON 不包含您可以Decoder
从"encoding/json"
包和它的方法DisallowUnknownFields中使用的意外字段。请参阅此处的示例https://play.golang.org/p/bif833qxytE
请注意,以json.NewDecoder
作为io.Reader
输入。您可以io.Reader
使用[]byte
bytes.NewReader创建
另一个主题是确保 JSON 包含所有预期的字段(或这些字段采用某种格式)。如何使其与"encoding/json"
包一起使用的答案是为结构实现自定义UnmarshalJSON
,可以在这里找到。但我不建议对此类任务使用这种方法,因为基本上这是对输入的验证,我宁愿为此使用验证包而不是混合职责。最常见的是go-playground/validator.v9,您应该在其中查找required
标签。这里讨论验证案例。
- 1 回答
- 0 关注
- 138 浏览
添加回答
举报
0/150
提交
取消