dump() 输出非json而是带html格式的调试信息,仅用于本地查看结构;正确返回json应使用json()或json_encode()并设置header。

dump() 输出的 JSON 看起来“错乱”不是 bug,是设计行为
dump() 是 ThinkPHP 的调试函数,本质是 var_dump() 的封装,它不输出 JSON 字符串,而是直接打印 PHP 变量结构。你看到的“JSON 格式错乱”,其实是数组/对象被展开成多行嵌套结构,中间夹杂着类型、长度、缩进等调试信息——这不是 JSON,也**不会被前端解析**。
常见误解:把 dump($data) 当作接口返回,然后在浏览器里复制粘贴去解析,结果报错 Unexpected token 或类似错误。这是因为 <code>dump() 输出的是 HTML(带 <pre class="brush:php;toolbar:false;"></pre> 标签和样式),根本不是纯 JSON。
- ✅ 正确用途:
dump()只用于本地开发时快速看数据结构,比如检查数据库查出来是不是空数组、字段名有没有拼错 - ❌ 错误用途:把它当 API 接口用,或截图发给前端联调,或用 Postman 请求后拿响应体当 JSON 解析
- ⚠️ 注意:
dump()会触发输出缓冲,一旦执行过,后续调用json()就可能报headers already sent
想看真正可解析的 JSON,别用 dump(),改用 json() 或原生 json_encode()
要验证接口返回是否为合法 JSON,必须走框架的 JSON 响应流程,而不是调试函数。
- 控制器中直接写:
return json($data);—— TP6 默认启用JSON_UNESCAPED_UNICODE(TP6.1+),中文不转义,格式干净 - 如果用了自定义状态码或 header:
return json($data, 200)->header('X-Debug', 'true'); - 若需兼容旧版 TP6.0 或手动控制:
return response(json_encode($data, JSON_UNESCAPED_UNICODE))->contentType('application/json'); - 切记不要:
dump($data); json($data);—— 第一句已输出内容,第二句会因 headers 已发送而失败
dump() 后页面显示 HTML 源码而非 JSON,是因为它默认输出带格式的 HTML
dump() 内部调用的是 think\helper\Debug::dump(),它会自动包裹 <pre class="brush:php;toolbar:false;"></pre> 和内联样式,并设置 Content-Type 为 text/html。哪怕你在 CLI 下运行,它也会加 ANSI 颜色字符——这都不是 JSON 解析器要的东西。
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
- 浏览器地址栏直接访问一个只写
dump($data)的接口?你会看到一堆缩进、颜色、array(3) { ... },这不是 JSON - Postman 里点 “Pretty” 视图看到乱码?那只是渲染器试图解析 HTML 标签失败,不是 JSON 本身有问题
- 真要裸看原始响应体:Postman 切到 “Raw” 或 “Preview” → 右键 → “View source”,你会发现开头就是
<pre class="brush:php;toolbar:false;" style="...</code"></pre>
真正需要“格式化 JSON”的场景,用 json_encode(..., JSON_PRETTY_PRINT)
如果你确实需要在日志、调试文件或命令行里看缩进良好的 JSON(比如排查字段嵌套深度),请绕过 dump(),直接用原生函数:
echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
注意三点:
- 这个输出仍是纯字符串,不含 HTML 标签,可安全复制进 JSONLint 校验
- 别在 Web 响应中直接
echo它——没设 header,浏览器会当 HTML 渲染;必须搭配header('Content-Type: application/json; charset=utf-8'); - TP6 日志中想统一美观输出?重写
think\log\formatter\Formatter,像知识库里的JsonFormatter那样用JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT处理记录
最常被忽略的一点:dump() 和 json() 完全是两条路,混用等于自己给自己埋 header 发送异常和前端解析失败的坑。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










