Fiber中c.JSON()最稳妥,自动设Content-Type并序列化,状态码默认200;传入不可序列化类型会报500,需用json tag、匿名结构体或DTO规避。

直接用 c.JSON() 最稳妥
Fiber 里返回 JSON 不需要手动设置 Content-Type 或序列化,c.JSON() 内部已处理好。它默认用 json.Marshal,状态码是 200,除非你显式传入其他状态码。
- 第一个参数是 HTTP 状态码(可选,默认 200),第二个是任意 Go 值(支持 struct、map、slice、基本类型)
- 如果值含不可序列化字段(比如
func、chan、未导出字段且没加json:tag),会返回 500 和错误信息json: unsupported type: xxx - 不建议在 handler 里先
json.Marshal再用c.SendString—— 会漏设Content-Type: application/json,前端可能解析失败
遇到 json: unsupported type: func 怎么办
常见于把带方法的 struct(比如 GORM 模型)直接传给 c.JSON(),而该 struct 包含未导出字段或函数类型字段。Fiber 不会自动过滤,得靠 Go 的 json tag 控制。
- 给结构体字段加
json:"-"忽略问题字段 - 用匿名结构体做“投影”,只取需要的字段:
c.JSON(200, struct{ Name string }{u.Name}) - 对数据库模型,优先用
map[string]interface{}或专用响应 DTO 结构体,避免暴露内部字段
c.Status().JSON() 和 c.JSON() 有啥区别
本质一样,c.Status(code).JSON(v) 是链式写法,等价于 c.JSON(code, v)。但要注意:链式调用中,Status() 只设状态码,不发响应;真正触发发送的是后续的 JSON()。
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
- 别写成
c.Status(404).SendString("not found")后再跟c.JSON(...)—— 已发响应,再调JSON()会 panic 报http: multiple response.WriteHeader calls - 如果要动态状态码,直接用
c.JSON(statusCode, data)更清晰,不易出错
需要自定义 JSON 序列化行为?
Fiber 默认用标准 encoding/json,不支持 time.Time 格式控制或 NaN 处理。真有这类需求,得换底层编码器。
- 启动时用
fiber.Config{JSONEncoder: myEncoder, JSONDecoder: myDecoder}替换 - 常见选择是
github.com/json-iterator/go(更快、支持更多选项)或goccy/go-json - 注意:换编码器后,所有
c.JSON()调用都会走新逻辑,包括错误响应(如c.Status(500).JSON(fiber.Map{"error": "xxx"}))
最简场景下,c.JSON() 足够用;复杂序列化需求往往意味着响应结构本身该拆分或封装,而不是堆砌 encoder 配置。

















