Beego需手动配置copyrequestbody=true并用json.Unmarshal解析JSON,返回必须调用ServeJSON();结构体字段须导出且带正确json标签,否则解析失败或返回空值。

Beego 默认不自动解析请求体里的 JSON,必须手动配置 + 显式反序列化;返回 JSON 也不能只塞进 Data["json"] 就完事,得调用 ServeJSON(),否则前端收到的是 HTML 或纯文本。
POST 请求接收 JSON 必须设 copyrequestbody = true
Beego 默认丢弃原始请求体(RequestBody 为空),不设这个配置,this.Ctx.Input.RequestBody 永远是空 slice。
- 在
conf/app.conf里加一行:copyrequestbody = true - 重启服务才生效,热重载不触发该配置重载
- 如果用
ParseForm()或GetString()去读 JSON 字段,一定失败——它们只处理 form-data 和 query string
解析 JSON 要用 json.Unmarshal(),不是 ParseForm()
ParseForm() 只认 application/x-www-form-urlencoded 和 multipart,对 application/json 完全无效。
- 先定义结构体,字段必须带
json:标签,比如Name string `json:"name"` - 用
json.Unmarshal(this.Ctx.Input.RequestBody, &obj)解析,别漏了取地址符& - 常见错误:结构体字段首字母小写 → JSON 字段不可导出 → 解析后值始终为空
- 如果 JSON 字段名含下划线(如
user_id),结构体字段名可大写(UserId),但标签必须严格匹配:`json:"user_id"`
返回 JSON 必须调用 ServeJSON(),不能只赋值 Data["json"]
只写 c.Data["json"] = obj 不会触发 JSON 渲染,Beego 会把它当普通变量传给模板,或者干脆忽略。
- 正确做法:赋值后立刻调用
c.ServeJSON() - 默认开启
beego.BConfig.EnableGzip = true时,ServeJSON()会自动 Gzip 压缩响应体 - 若需自定义状态码(比如 201 Created),在
ServeJSON()前设:c.Ctx.ResponseWriter.WriteHeader(201) - 注意:
ServeJSON()会设置Content-Type: application/json; charset=utf-8,无需手动设 Header
结构体 JSON 标签漏写或错写,会导致字段为空
这是最隐蔽也最常踩的坑:数据库查出数据、结构体也赋了值,但 ServeJSON() 返回全是 null 或空字符串。
- 检查每个字段是否都有
json:标签,且拼写与前端期望一致(大小写、下划线) - 嵌套结构体同理,内层字段也要标,比如
Name struct { Full string `json:"full"` } - 零值字段(空字符串、0、false)默认会被 Beego 的
json.Marshal()序列化出来,除非你额外加omitempty—— 但别乱加,否则前端拿不到字段 - 时间类型字段推荐用
time.Time+json:"created_time",Beego 会自动转为 RFC3339 格式字符串
结构体标签和配置项这两处一旦漏掉,JSON 流程就断在中间,既收不到也发不出,排查时优先盯死 app.conf 和结构体定义。


















