json_encode()需规范使用:过滤不可序列化类型、中文加json_unescaped_unicode、时间转时间戳或iso8601、空数组与null按业务显式处理;必须设置content-type和cors头;响应结构契约化,字段映射、类型严格、浮点数精度控制。

json_encode() 是唯一可靠起点,但直接调用常导致前端解析失败、中文乱码或结构错乱——关键不在“转不转”,而在“怎么转、转成什么样”。
为什么 json_encode($arr) 不能直接用
它默认把中文转成 \u4f60\u597d,嵌套空数组变成 [] 而不是 null,资源句柄或闭包直接让整个输出变 false。更隐蔽的是:如果 $arr 含有 MySQL 的 datetime 字段(如 "2026-08-31 14:22:05"),json_encode() 不会自动格式化,前端拿到的就是原始字符串,后续日期处理极易出错。
- 必须提前过滤掉
resource、Closure、DOMDocument等不可序列化类型 - 含中文时务必加
JSON_UNESCAPED_UNICODE选项 - 时间字段建议统一转为时间戳(
strtotime())或 ISO8601 字符串(date('c', $ts)) - 空数组
[]和null在前端语义不同,需按业务约定显式转换(例如用array_filter($arr, 'is_null')清理或补默认值)
接口返回前必须设置的响应头
只 echo JSON 字符串,浏览器可能当成 HTML 解析,导致前端 fetch 拿到 response.ok === false 或 response.json() throws SyntaxError。这不是前端问题,是 PHP 响应头缺失。
- 必须在
echo json_encode(...)前调用header('Content-Type: application/json; charset=utf-8') - 若接口被跨域调用(如前端在
http://localhost:3000访问 PHP 接口),还得加header('Access-Control-Allow-Origin: *')(生产环境请替换为具体域名) - 避免在输出 JSON 前有任何
echo、var_dump、空白字符或 BOM 头,否则 JSON 解析必然失败
怎么让后端数组结构和前端预期对齐
常见错误是 PHP 返回 ['user' => [...], 'count' => 12],前端却硬编码去取 res.data。结构不契约化,改一个字段就全链路报错。
- 定义统一响应模板:比如始终返回
['code' => 0, 'msg' => 'ok', 'data' => [...]],前端所有接口都按这个解构 - 用
array_map()或循环预处理数据字段:把数据库字段名user_name映射为前端习惯的name,避免前端到处写item.user_name || item.name - 数值型 ID、金额等字段,确保 PHP 输出的是数字而非字符串(
(int)$id、(float)$price),否则前端===判断永远为 false - 布尔值保持原生:不要用
'1'/'0'字符串代替true/false,json_encode()会正确输出,前端也无需二次转换
最易被忽略的一点:PHP 的 json_encode() 对浮点数精度控制有限,像 0.1 + 0.2 可能输出 0.30000000000000004。涉及金额等敏感字段,务必用 number_format($val, 2, '.', '') 或 bcadd() 控制小数位并转为字符串再 encode。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











