c.json() 返回空或字段丢失的主因是结构体字段未导出(小写开头)或缺失 json tag;必须首字母大写且 tag 与前端字段严格匹配,调用后需 return 防止响应被覆盖。

直接用 c.JSON() 就行,但必须确保结构体字段导出、带 json tag,且别在调用后漏掉 return。
为什么 c.JSON() 返回空或字段丢失
最常见原因是结构体字段未导出(小写开头)或缺失 json tag。Fiber 底层用标准 encoding/json,只处理首字母大写的导出字段。
- 错误写法:
type User { name string `json:"name"` }→name不导出,永远为空 - 正确写法:
type User { Name string `json:"name"` }→ 首字母大写 + tag 严格匹配请求字段 - 如果前端传的是
user_id,tag 必须是`json:"user_id"`,不能只靠字段名自动推导 - 可选字段想区分“未传”和“传了空字符串”,用
*string,但别全用指针——判空成本高
c.JSON() 调用后不 return 会覆盖响应
c.JSON() 只是设置响应体和 Content-Type: application/json,不是立即发送。后续若再调 c.SendString() 或另一个 c.JSON(),前面的就会被覆盖。
- 典型踩坑:
if err != nil { c.Status(400).JSON(...) }后没return,接着执行c.JSON(...)→ 最终返回的是后者 - 安全写法:
return c.Status(400).JSON(fiber.Map{"error": "invalid"}) - 调试时可用
fmt.Println(c.Response().StatusCode())确认最终状态码
别把 c.FormValue() 当 JSON 解析器用
c.FormValue("key") 只对 application/x-www-form-urlencoded 和 multipart/form-data 有效;对 application/json 请求完全无效,永远返回空字符串。
- 发 JSON 时,该用
c.BodyParser(&v)或c.Struct(&v),且v必须是指针 -
c.BodyParser()失败时返回具体json.UnmarshalError,不是 HTTP 错误,需手动处理 - 别依赖中间件自动解析 JSON —— Fiber 默认不注册任何 JSON 解析中间件
最容易被忽略的是:结构体字段名大小写、json tag 和前端 payload 字段必须**逐字匹配**,多一个下划线、少一个空格,字段就静默丢弃。上线前用 Postman 发个完整样例,打个断点看解析结果,比读文档管用。











