正确写法是json_encode($data, json_unescaped_unicode | json_unescaped_slashes),用于避免中文转义和斜杠转义;thinkphp中可通过json($data, 该组合常量)或tp6.1+全局配置'json_encode'=>[json_unescaped_unicode|json_unescaped_slashes]统一生效。

json_encode() 里直接传 JSON_UNESCAPED_SLASHES
这个常量只在 json_encode() 函数中生效,作用是避免把 / 自动转成 \/。它不能单独用,必须和其它 JSON 常量用按位或(|)组合。
常见错误是写成字符串:'JSON_UNESCAPED_SLASHES' 或漏掉 JSON_UNESCAPED_UNICODE 导致中文又被转义。
- 正确写法:
json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) - 错误写法:
json_encode($data, 'JSON_UNESCAPED_SLASHES')(字符串无效) - 错误写法:
json_encode($data, JSON_UNESCAPED_SLASHES)(没处理中文,仍会出\u4f60)
ThinkPHP 的 json() 助手函数怎么加这个参数
json() 是 ThinkPHP 封装的响应构造函数,第二个参数就是透传给 json_encode() 的选项位掩码。
所以加 JSON_UNESCAPED_SLASHES 的方式和原生一致,但必须带上 JSON_UNESCAPED_UNICODE 才算完整:
- 推荐写法:
return json($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); - 如果只返回状态码(比如 201),第三个参数才是 HTTP 状态码:
return json($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES, 201); - 别写成
json($data, 200, JSON_UNESCAPED_...)——顺序错了,200 会被当成选项,状态码反而失效
TP6.1+ 全局配置后还用不用手动传
可以不用,但得确认配置已生效。在 config/app.php 里加这一行:
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
'json_encode' => [JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES],
之后所有 json()、response()->json()、甚至框架内部异常响应都会自动带上这两个标志。
注意点:
- TP6.0 及更早版本不支持该配置项,强行加了也无效
- 配置值必须是数组,哪怕只有一项:
[...],不能直接写成... - 中间件或钩子中提前输出内容(如 Trace、日志),会导致 header 已发送,此时全局配置虽生效但响应发不出去
数据库 JSON 字段写入时也要用它
模型里声明 protected $json = ['config']; 后,ThinkPHP 写入前会自动调用 json_encode(),但默认只用了 JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES —— 这部分其实是安全的。
但如果你绕过模型,用 Db::table() 直接写入,就必须自己加:
- 错误:
Db::table('user')->insert(['config' => json_encode($arr)])(斜杠和中文全被转义) - 正确:
Db::table('user')->insert(['config' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)]) - 读取时不会自动反解,仍是字符串;要转数组得自己
json_decode($row['config'], true)
真正容易被忽略的是:即使 JSON 编码没问题,若数据库连接字符集不是 utf8mb4,或者字段本身存的就是乱码,那最终输出的 JSON 里中文还是错的——JSON_UNESCAPED_SLASHES 解决不了源头污染。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










