如何在Think控制器中输出JSON数据 json函数与Header设置实战案例|Duuu笔记
ThinkPHP中json()方法需显式return才能生效,它返回think\Response实例并自动设置Content-Type;错误写法如仅调用不return或混用show()会导致空白、乱码或头信息错误。
ThinkPHP 5/6 中
json()
方法直接返回 JSON 的正确用法
ThinkPHP 自带的
json()
方法不是“输出”,而是构造一个响应对象,必须显式返回才能生效。很多人写了
json($data)
却没加
return
,结果页面空白或输出原始数组。
json()
返回的是
think\Response
实例,不
return
就等于没执行响应逻辑
在控制器方法末尾必须写
return json($data);
,不能只调用
json($data);
ThinkPHP 6 默认开启 JSON 自动格式化(加缩进、转义中文),如需紧凑格式,传入第二个参数:
return json($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
该方法会自动设置
Content-Type: application/json; charset=utf-8
,无需手动
header()
手动
header()
+
echo json_encode()
的风险点
绕过框架响应机制、直接用原生方式输出 JSON,在 ThinkPHP 里容易引发头信息已发送错误(
Cannot modify header information
),尤其在开启调试模式或有日志/Trace 输出时。
框架中间件、钩子或异常处理可能已在响应前输出了内容(比如 Trace 信息),此时再调
header()
必然报错
json_encode()
默认不处理中文(转成 \uXXXX),需显式加
JSON_UNESCAPED_UNICODE
,否则前端看到乱码或转义字符
漏设
Content-Type
或编码声明,部分前端(如 Axios)可能解析失败或默认按 text/plain 处理
示例错误写法:
header('Content-Type:application/json'); echo json_encode($data);
—— 缺少
charset=utf-8
,且未做错误检查
ThinkPHP 6 中
json()
与
show()
/
success()
的区别
别把
json()
和封装好的业务响应方法混用。
success()
是基于
json()
的语义化包装,但结构固定;而
json()
完全自由,适合 API 接口定制。
ima.copilot
腾讯大混元模型推出的智能工作台产品,提供知识库管理、AI问答、智能写作等功能
下载
return success('ok', $data);
输出固定结构:
{"code":1,"msg":"ok","data":{...}}
,适用于标准 RESTful 响应规范
return json($data);
输出就是裸数据,
$data
是什么就输出什么,无额外字段
show()
是为 HTML 页面设计的,返回的是
text/html
,即使传数组也会被当成模板变量渲染,绝不能用于 JSON 接口
如果接口需要兼容旧版结构(如含
status
字段),不要改
success()
源码,直接用
json(['status' => 'success', 'data' => $data])
调试时 JSON 响应被截断或乱码的常见原因
前端收到不完整 JSON 或解析报错,大概率不是
json()
本身的问题,而是输出前有意外内容干扰,或者编码不一致。
“
PHP免费学习笔记(深入)
”;
控制器方法顶部或引入文件中有空格、BOM 头、
echo
/
var_dump()
遗留,导致 HTTP 头已发送
数据库查询结果含资源类型(如 PDOStatement)、闭包、不可序列化对象,
json_encode()
会静默失败并返回
false
,最终输出空字符串
MySQL 连接未设 UTF8MB4,存了 emoji 或生僻字,
json_encode()
因编码不匹配返回空
验证方法:先用
return json(['test' => 'hello']);
确认基础通路;再逐步加入实际数据,用
is_json($str) { return is_string($str) && null !== json_decode($str, true); }
检查每一步输出是否合法
框架对 JSON 的封装很轻量,真正麻烦的从来不是怎么调
json()
,而是数据源头是否干净、输出路径是否被污染、字符集是否全程统一。这些地方一出问题,错误表现往往和 JSON 本身无关,排查时容易走偏。
