必须手动设置 Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;设完后直接 return 关联数组,框架自动序列化并设置 Content-Type: application/json 头。

Yii 默认返回的 JSON 不带 Content-Type: application/json,前端 fetch 或 axios 会解析失败,必须手动设置响应头。
Yii2 中如何正确返回 JSON 数据
Yii2 的 Json::encode() 只负责序列化,不自动设置响应头或终止输出。直接 echo 会导致 header 已发送、内容混杂等问题。
- 用
Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;声明格式,框架会自动设 header 并序列化data属性 - 返回数组时,写
return ['code' => 0, 'data' => $user];即可,无需手动Json::encode() - 若在控制器中提前写了
echo或var_dump,后续设 format 会失效(headers already sent) - 调试时可用
Yii::info($data, 'api');记日志,避免污染输出
Yii3(1.0+)里 JSON 返回更简洁但有兼容陷阱
Yii3 默认启用 JsonResponse,但仅在 API 模块或显式配置后生效。裸用 Controller 类仍需手动处理。
- 推荐继承
\yii\rest\Controller,它默认将返回值转为 JSON,并设好 header 和状态码 - 若用普通
Controller,需显式 return new\yii\web\JsonResponse($data)—— 注意不是Json::encode() - Yii3 的
JsonResponse默认禁用 JSON_UNESCAPED_UNICODE,中文不会被转义;但若自己调json_encode($data, JSON_UNESCAPED_UNICODE)再塞进 response,反而可能重复编码 - 跨域请求时,
JsonResponse不自动加 CORS 头,仍要配cors行为或中间件
常见错误:406 Not Acceptable 或前端解析为空
这通常不是数据问题,而是响应头或编码不匹配导致的解析中断。
- 检查 Network 面板里 Response Headers 是否含
Content-Type: application/json; charset=UTF-8 - 确认没在 action 里调用
exit、die或Yii::$app->end()后又 return 数据 - 如果用了
beforeAction()并修改了 response 格式,记得在 action 里重置或统一管理 - NGINX/Apache 若启用了 gzip,而 JSON 响应体被截断(如末尾少一个
}),浏览器会静默失败 —— 此时看 raw response 最准
最易被忽略的是 Yii 的 response 生命周期:format 设定时机必须早于任何输出,且不能和 Response::send() 冲突。一旦走错路径,JSON 看似“返回了”,实际是 HTML 包裹着一串字符串。


















