Revel中正确解析JSON请求体需显式调用c.Params.ParseBody(c.Request)或手动读取+json.Unmarshal,且客户端必须设置Content-Type: application/json;JSON字段不存于c.Params中,须用带json标签的结构体接收,错误须主动检查并返回400。

Revel框架里怎么正确解析JSON请求体
Revel默认不自动解析JSON请求体,params里拿不到字段,直接读request.Body又容易出错——核心原因是没调用ParseBody或没配对Content-Type。
必须显式触发解析,且要求客户端发送时带Content-Type: application/json,否则Revel会跳过JSON解码逻辑。
- 在Controller方法开头调用
c.Params.ParseBody(c.Request)(推荐) - 或者手动读取:
body, _ := io.ReadAll(c.Request.Body),再用json.Unmarshal解析 - 注意:
ParseBody只对POST/PUT/PATCH生效,GET请求不处理请求体
用结构体接收JSON时字段名映射总失败
Go结构体字段首字母大写才可导出,JSON键名默认按字段名匹配,但大小写和下划线常不一致——比如前端传user_name,结构体字段叫UserName就收不到。
必须加json标签明确映射:
type UserInput struct {
ID int `json:"id"`
UserName string `json:"user_name"`
Email string `json:"email"`
}
- 标签值区分大小写,
"user_name"不能写成"USER_NAME" - 如果字段是空字符串或零值,且JSON里没传该字段,结构体对应字段会保持零值(不是报错)
- 嵌套对象、切片都支持,但内层结构体也要加
json标签
为什么c.Params.Get取不到JSON字段
c.Params.Get查的是URL查询参数、路由参数和表单数据(application/x-www-form-urlencoded),**完全不碰JSON请求体**。这是最常踩的坑。
- JSON数据只进
ParseBody后的结构体或map[string]interface{},不在c.Params里 - 想临时调试可以打印
c.Params.All(),确认它确实不含JSON字段 - 若混用查询参数和JSON体,要分开处理:
c.Params.Get("id")取URL参数,结构体取JSON体
错误响应和空JSON体怎么处理
前端发空JSON({})、非法JSON({key: "value"}缺引号)或字段类型错(字符串塞给int字段),Revel不会自动返回400——得自己检查。
-
ParseBody返回error,必须判断:if err != nil { return c.RenderError(err) } - 解码到结构体后,建议校验关键字段是否为零值,避免静默失败
- 空JSON体(
{})能成功解码,但所有字段都是零值,需业务逻辑判断是否允许
JSON解析这步看似简单,但Revel把控制权交给你——不设默认行为,也不拦截非法输入,漏掉错误检查就容易让坏数据进业务层。


















