php 返回 json 应使用 json_encode() 生成,设 content-type: application/json 响应头,确保 utf-8 编码,检查返回值防 false,并避免输出前空白、bom 或意外输出。

PHP 返回 JSON 数据不需要手动拼接字符串,关键在于用对函数、设对头、避开编码陷阱。
用 json_encode() 生成标准 JSON 字符串
这是唯一推荐的序列化方式,手动拼接引号、逗号、转义极易出错。
-
json_encode()会自动处理中文乱码(前提是 PHP 文件本身是 UTF-8 编码,且数据源也是 UTF-8) - 默认不支持中文 GBK/GB2312 数据,需先用
mb_convert_encoding()转成 UTF-8 - 遇到
null、资源(resource)、不可序列化对象时会返回false,务必检查返回值 - 示例:
$data = ['name' => '张三', 'score' => 95]; $json = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); if ($json === false) { http_response_code(500); echo json_encode(['error' => 'JSON encode failed: ' . json_last_error_msg()]); exit; }
必须设置 Content-Type: application/json 响应头
没设这个头,前端 fetch 或 axios 可能无法自动解析为对象,jQuery 甚至可能直接报 parsererror。
- 调用
header()必须在任何输出之前(包括空格、BOM、echo) - 推荐写法:
header('Content-Type: application/json; charset=utf-8'); - 如果用了框架(如 Laravel、ThinkPHP),通常已有自动设置逻辑,但自定义接口仍需确认
- 调试时可用浏览器开发者工具的 Network → Response Headers 查看是否生效
常见格式问题和对应修复
不是 JSON 格式错误,而是实际开发中高频踩坑点:
立即学习“PHP免费学习笔记(深入)”;
- PHP 文件开头或结尾有多余空行或 BOM:导致响应体开头出现空白字符,JSON 解析失败(错误信息类似
Unexpected token) - 开启了
output_buffering但未清理,或意外触发了var_dump()、print_r()输出 - 数据库查出的字段含 HTML 实体(如
&)、换行符\n或制表符\t:这些在 JSON 中合法,但前端渲染可能异常;必要时用htmlspecialchars_decode()或str_replace()清理 - 时间字段是 MySQL 的
DATETIME,直接json_encode()会变成字符串,但格式不统一(如"2024-05-20 14:23:00");建议统一转为时间戳或 ISO8601 格式:date('c', strtotime($row['created_at']))
最麻烦的往往不是怎么生成 JSON,而是数据源头混杂编码、中间层偷偷输出、响应头被覆盖——调试时优先看 Network 面板的原始响应内容,而不是只信前端控制台的错误提示。











