ThinkPHP如何配置JsonFormatter格式_JsonFormatter格式化输出【规范】
ThinkPHP配置JSON格式化输出可通过内置json()函数添加JSON_PRETTY_PRINT参数实现缩进与中文不转义;也可自定义JsonFormatter类注册为响应输出器,或通过中间件拦截重写响应体,还可利用调试模式Trace面板或服务器端过滤模块处理。
在实际开发中,我们常常遇到这样的场景:用ThinkPHP返回JSON数据,结果出来的是紧凑的一行,中文还被转义了。这多半是因为没有正确配置JSON格式化器。这篇文章就来梳理一下,如何让ThinkPHP输出带缩进、中文不转义的可读JSON。

下面给出几种常用方案,从最简单的内置函数到自定义类、中间件,再到服务端层面的处理,按需选用即可。
一、使用ThinkPHP内置json()函数并传入格式化参数
ThinkPHP 6 的 json() 助手函数默认已经开启了 JSON_UNESCAPED_UNICODE 和 JSON_UNESCAPED_SLASHES,但缩进格式不会自动加——你需要显式传入 JSON_PRETTY_PRINT。
具体操作很简单:
- 先在控制器方法中准备好要输出的数据数组,比如
$data = ['code' => 0, 'message' => 'SUCCESS', 'data' => ['user_id' => 100, 'name' => '张三']]; - 然后调用
return json($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT);
这行代码会自动设置 Content-Type: application/json; charset=utf-8,并输出带缩进和换行的格式化JSON。不过需要留意:JSON_PRETTY_PRINT 只在 PHP 5.4+ 里有效,而且会增加响应体大小,生产环境建议关掉。
二、自定义JsonFormatter类并注册为响应输出器
如果全站API都要统一格式,可以写一个自定义的响应类,封装格式化逻辑。比如在 app/common/formatter/JsonFormatter.php 里创建一个类,继承 think\Response,然后重写 output() 方法,对原始数据调用 json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT)。
写好后在 config/app.php 中配置 'response' => \app\common\formatter\JsonFormatter::class; 即可。关键点在于必须保证该类继承自 think\Response 并正确复写 send() 流程,否则 header 设置可能被跳过。
三、在中间件中拦截JSON响应并重写内容
这个方法适合那些旧项目,控制器逻辑不方便修改。写一个中间件,在响应发出前捕获已生成的JSON字符串,然后重新格式化。
- 创建中间件
app/middleware/JsonPrettyMiddleware.php - 在
handle()方法里判断响应类型是否为application/json - 若是,获取原始内容,用
json_decode($content, true)解析,再json_encode(..., JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) - 更新响应体:
$response->content($formattedJson)->header('Content-Length', strlen($formattedJson))
警告:此方式必须确保响应尚未发送(即还没触发 send()),否则会报 Cannot modify header information 错误。
四、使用调试模式下的Trace信息自动注入格式化JSON
如果只是开发阶段想看看美化后的JSON,又不想影响正式响应,可以利用ThinkPHP调试模式的Trace面板。在 config/trace.php 里添加自定义面板,写一个trace插件类,在 onEnd 钩子中检测当前请求是否为JSON接口,若是,就把原始响应数据解析后生成HTML格式化预览块(不替换原响应)。这样既不影响前端解析,又能方便调试。
五、通过Apache/Nginx响应过滤模块实现服务端格式化
最后一种思路是在Web服务器层面做美化,完全不需要改PHP代码。适合运维统一管控的场景,但一般只建议在低QPS调试环境用。
- Apache:启用
mod_substitute模块,配置基础缩进规则(如Substitute "s/{/ {\n/g") - Nginx:用
ngx_http_sub_module配合正则匹配JSON开头插入换行和缩进 - 更可靠的方式是在OpenResty中写Lua脚本,用
cjson.pretty.encode()进行标准格式化
需要提醒的是:服务端过滤会增加CPU开销,而且大体积JSON容易超内存限制,生产环境慎用。


































