ctx.json 是 iris 中最直接的 json 响应方式,自动设 content-type、序列化并写入响应体,但需注意:字段标签必须匹配(如 json:"name")、显式设置状态码、建议启用 gzip 压缩。

ctx.JSON 是 Iris 返回 JSON 响应最直接、最常用的方式,它会自动设置 Content-Type: application/json、序列化数据并写入响应体——但要注意它默认不压缩、不处理错误场景,且对结构体字段标签敏感。
ctx.JSON 用法与字段标签必须匹配
调用 ctx.JSON 时,传入的值会被 json.Marshal 序列化。如果结构体字段没加 json 标签,首字母小写的字段会被忽略(Go 的导出规则),大写字母开头但无标签的字段则按原名输出。
- 错误写法:
type User { Name string }→ 前端收到{"Name": "xxx"},不符合常见小驼峰习惯 - 正确写法:
type User { Name string `json:"name"` }→ 输出{"name": "xxx"} - 忽略空值:
Age int `json:"age,omitempty"`,当Age == 0时该字段不出现在 JSON 中 - 嵌套结构、切片、指针都支持,无需额外配置
返回错误 JSON 时别直接 ctx.JSON(iris.Map{...})
HTTP 错误状态码(如 400、500)不会自动随 ctx.JSON 设置,必须显式调用 ctx.StatusCode。否则前端看到的是 200 状态 + 错误内容,难以区分成功/失败。
使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。
- ❌ 错误:
ctx.JSON(iris.Map{"error": "not found"})→ 状态码仍是 200 - ✅ 正确:
ctx.StatusCode(iris.StatusNotFound); ctx.JSON(iris.Map{"error": "user not found"}) - 更稳妥:封装一个
writeError(ctx, code, msg)函数统一处理
大体积 JSON 响应建议启用 Gzip 压缩
ctx.JSON 本身不压缩,但 Iris 提供了 iris.Compression 中间件,对 application/json 类型自动启用 Gzip(需客户端声明 Accept-Encoding: gzip)。
- 启用方式:
app.Use(iris.Compression),放在路由注册前 - 注意:压缩对小响应(
- 若需细粒度控制(如仅压缩 API 路由),可用
app.Party("/api").Use(iris.Compression)
真正容易被忽略的是:JSON 响应体里的时间字段默认转成 RFC3339 字符串(如 "2026-09-30T03:52:00Z"),如果你用 time.Time 字段又没自定义 JSON Marshal 方法,前端拿到的就是这个格式——不是 Unix 时间戳,也不是 MySQL 的 Y-m-d H:i:s,别在前端硬解析。










