应使用return json($data, json_unescaped_unicode | json_unescaped_slashes | json_pretty_print),该调用自动设置content-type并输出带缩进换行的可读json,生产环境建议关闭json_pretty_print。

如果您在ThinkPHP中需要将JSON数据以可读性更强的格式输出,但当前返回的是紧凑无缩进、中文被转义的原始字符串,则可能是由于未启用或未正确配置JSON格式化器。以下是实现JSON格式化输出的多种方法:
一、使用ThinkPHP内置json()函数并传入格式化参数
ThinkPHP 6 的 json() 助手函数默认支持 JSON_UNESCAPED_UNICODE 和 JSON_UNESCAPED_SLASHES,但不自动启用缩进格式;需显式传入 JSON_PRETTY_PRINT 选项以启用美化输出。
1、在控制器方法中定义要输出的数据数组,例如 $data = ['code' => 0, 'message' => 'SUCCESS', 'data' => ['user_id' => 100, 'name' => '张三']];
2、调用 return json($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT);
3、该调用将自动设置 Content-Type: application/json; charset=utf-8,并输出带缩进与换行的格式化JSON
4、注意:JSON_PRETTY_PRINT 仅在 PHP 5.4+ 中可用,且会增加响应体体积,生产环境建议关闭
二、自定义JsonFormatter类并注册为响应输出器
通过继承 ThinkPHP 的 Response 类并重写 send 方法,可封装统一的格式化逻辑,适用于全站API统一规范输出场景。
1、创建 app/common/formatter/JsonFormatter.php 文件,定义类如下:
2、在类中重写 output() 方法,对原始数据调用 json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT)
3、在应用配置 config/app.php 中,将 'response' => \app\common\formatter\JsonFormatter::class;
4、关键点:必须确保该类继承自 think\Response 并复写 send() 流程,否则 header 设置可能被跳过
三、在中间件中拦截JSON响应并重写内容
利用ThinkPHP中间件机制,在响应发出前捕获已生成的JSON字符串,进行二次格式化处理,适用于无法修改控制器逻辑的存量项目。
1、创建中间件 app/middleware/JsonPrettyMiddleware.php
2、在 handle() 方法中判断响应类型是否为 application/json
3、若匹配,获取原始响应内容,用 json_decode($content, true) 解析后重新 json_encode(..., JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT)
4、调用 $response->content($formattedJson)->header('Content-Length', strlen($formattedJson)) 更新响应体
5、警告:此方式需确保响应尚未发送(即未触发 send()),否则将导致 Cannot modify header information 错误
四、使用调试模式下的Trace信息自动注入格式化JSON
在开发阶段启用 ThinkPHP 调试模式时,可通过 Trace 面板扩展功能,在接口响应旁附加格式化预览,不影响正式响应结构。
1、在 config/trace.php 中添加自定义面板配置项
2、编写 trace 插件类,在 onEnd 钩子中检测当前请求是否为 JSON 接口
3、若检测到,将原始响应数据解析后生成 HTML 格式化预览块(非替换原响应)
4、该方案仅用于开发辅助,不改变实际 HTTP 响应内容,避免影响前端解析逻辑
五、通过Apache/Nginx响应过滤模块实现服务端格式化
在Web服务器层对所有 application/json 响应进行实时美化,无需修改PHP代码,适合运维统一管控场景。
1、Apache环境下启用 mod_substitute 模块,配置 Substitute "s/{/ {\n/g" 等基础缩进规则
2、Nginx环境下使用 ngx_http_sub_module,配合正则匹配 JSON 开头并插入换行缩进
3、更可靠方式是部署 Lua 脚本(OpenResty),使用 cjson.pretty.encode() 进行标准格式化
4、注意:服务端过滤会增加CPU开销,且无法处理大体积JSON(易超内存限制),仅建议用于低QPS调试环境
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











