直接 return json() 即可,但需确保无任何前置输出;TP6 的 json() 自动设 Content-Type 并编码,对 BOM、空格、错误警告等极敏感,须用 UTF-8 无 BOM 编码,禁用 echo/var_dump,统一响应应封装为 return json(...) 而非数组或 echo。

直接 return json() 就行,但得确保没额外输出
ThinkPHP6.0 的 json() 是最轻量、最常用的 JSON 响应方式,它自动设置 Content-Type: application/json,并调用 json_encode() 编码数据。但它对“干净输出”极其敏感——只要 json() 之前有任何输出(哪怕一个空格、BOM头、echo 或错误警告),JSON 就会损坏。
常见错误现象:Unexpected token in JSON at position 0,浏览器控制台看到响应开头有隐藏的 EF BB BF 字节(即 UTF-8 BOM);Java 或 Axios 接收时解析失败,但本地开发环境可能侥幸通过。
- 检查所有 PHP 文件是否保存为「UTF-8 无 BOM」格式(尤其
config/、route/、中间件和控制器文件) - 确认没有在
json()前执行echo、var_dump()、print_r()或未捕获的 Notice/Waring(比如访问未定义数组键) - 避免在配置文件或函数定义前留空行或空格
- 如果用了自定义异常类,确保其
render()方法返回的是json(),而不是拼接字符串或response()->content()
Content-Type 不是 application/json?检查请求头和框架自动识别逻辑
TP6 默认会根据请求的 Accept 头或 Content-Type 自动切换响应类型,但这个行为容易被误用。例如你用 Postman 发送 application/json 请求体,却没带 Accept: application/json,TP6 可能仍走 HTML 模板渲染流程,导致返回的是带 HTML 标签的错误页而非纯 JSON。
解决方法是绕过自动识别,强制指定输出类型:
立即学习“PHP免费学习笔记(深入)”;
- 始终用
return json($data, $code);,不要依赖“发起 JSON 请求就自动 JSON 响应” - 如果必须用
response(),请显式设置类型:return response($data)->contentType('application/json'); - 前端发请求时,
Content-Type: application/json必须严格匹配,不能写成application/json; charset=utf-8(某些 TP6.0.x 版本会因此跳过 JSON 解析逻辑) - 调试时可用
dump($request->isJson());确认框架是否识别为 JSON 请求
$request->input() 拿不到 JSON 字段?改用 $request->json()
TP6 默认不解析 application/json 请求体,$request->input() 只处理 form-data 和 urlencoded。所以即使前端发了 {"name":"张三"},$request->input('name') 也一定为空。
正确做法是直接用 $request->json():
-
$request->json()(无参)→ 返回完整解码后的关联数组 -
$request->json('name')→ 取顶层字段 -
$request->json('profile.age')→ 支持点号路径取嵌套值 - 若 JSON 格式错误或为空,
$request->json()返回null,需自行判断,不会抛异常 - TP6.1+ 可在中间件中调用
$request->withJson(true)全局启用;TP6.0 必须手动调用$request->json()触发解析
统一响应结构?别在每个控制器里重复写 code/msg/data
硬编码 ['code'=>200,'msg'=>'ok','data'=>$xxx] 容易遗漏、不一致,也不利于后续加日志或监控。推荐封装为静态方法或服务类,但要注意两点:
- 封装函数内部仍要调用
json(),而不是echo json_encode()—— 否则响应头不会自动设置 - 不要在封装里做
exit或die,TP6 的响应必须由return驱动生命周期 - 如果用于异常统一处理,确保自定义
ExceptionHandle::render()中返回的是json()实例,而非数组或字符串 - 示例:一个安全的封装写法是
return json(['code'=>0,'data'=>$data]);,而不是return ['code'=>0,'data'=>$data];(后者会被框架当 HTML 渲染)
最易被忽略的一点:TP6 的 json() 函数本质是创建并返回一个 \think\response\Json 对象,它参与完整的响应生命周期。任何试图“提前输出”或“绕过返回机制”的操作,都会让框架失去控制权,最终导致 JSON 残缺或响应头错乱。



















