必须 return json($data),因json()返回json实例,需return触发框架响应;echo或无return会导致头错误或空白;参数可控制中文和斜杠转义;勿混用show/success;注意bom、输出污染及json_encode失败静默问题。

ThinkPHP 5 中发送 JSON 数据,核心就一条:必须 return json($data),不能只调用不返回,否则响应为空或乱码。
为什么 return json($data) 是唯一推荐写法
ThinkPHP 5 的 json() 函数不是“打印”函数,它返回一个 think\response\Json 实例,这个实例封装了数据、Content-Type: application/json; charset=utf-8 头、状态码等完整响应逻辑。框架的响应生命周期靠控制器方法的 return 值触发。
- 写成
json($data);(无 return)→ 响应对象被创建又丢弃,浏览器收不到任何有效输出,常见表现是空白页或 500 错误 - 写成
echo json_encode($data);→ 绕过框架响应机制,头信息未设置或已发送(尤其在调试模式下有 Trace 输出时),报Cannot modify header information -
return json($data)→ 框架自动接管,正确发头、输出、结束请求
json() 的参数控制:紧凑格式与中文处理
默认情况下,ThinkPHP 5 的 json() 会启用缩进和转义中文(\uXXXX),前端看到的是可读性好但体积大的 JSON。生产环境通常要关掉这些:
使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。
- 传入第二个参数:例如
return json($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); -
JSON_UNESCAPED_UNICODE→ 中文不转义,直接输出“张三”而非“\u5f20\u4e09” -
JSON_UNESCAPED_SLASHES→ 不转义/,避免https:\/\/example.com这种冗余 - 注意:不要传
JSON_PRETTY_PRINT,它会强制换行缩进,在 API 接口中无意义且增加传输体积
别混用 show()、success() 和 json()
这三者定位完全不同,混用会导致 Content-Type 错误或结构污染:
-
show()是为 HTML 页面设计的,返回text/html,即使你传数组进去,它也会当成模板变量去渲染,绝不可用于 API -
success()是语义化包装,固定返回{"code":1,"msg":"ok","data":{}}结构,适合标准业务接口;但它底层仍是基于json(),所以也必须return success(...) -
json()是裸数据通道,结构完全由你控制;如果需要兼容旧版字段如status,直接写return json(['status' => 'success', 'data' => $data]);,别去改success()源码
调试时 JSON 被截断或解析失败的真正原因
前端报 SyntaxError: Unexpected token 或收到半截 JSON,90% 不是 <code>json() 的锅,而是输出被污染:
- 控制器开头、引入的配置文件、公共函数文件里有 BOM 头、空格、
echo/var_dump()遗留 - 日志写入或 Trace 开启后,在
json()执行前已有内容输出,导致 HTTP 头无法再设置 - 数据库查询结果含非法 UTF-8 字符(如从 Excel 导入的乱码),
json_encode()返回false,最终输出空字符串 → 前端收到空响应,解析失败 - 验证方式:用 curl 直接请求接口,
curl -i http://yourdomain.com/api/test,看响应头是否含Content-Type: application/json,body 是否为合法 JSON
最易被忽略的一点:ThinkPHP 5 默认不校验 json_encode() 是否成功。如果数据里有资源句柄、循环引用或非法字符,json() 方法会静默返回空,不会抛异常。上线前务必检查数据源的干净程度,必要时加 if (json_last_error() !== JSON_ERROR_NONE) { throw new \Exception('Invalid JSON data'); }。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










