json_encode()失败需手动检查返回值是否为false,配合json_last_error()获取具体错误;常见原因包括编码不一致、资源/闭包/循环引用;应统一错误响应结构并联动HTTP状态码,避免输出缓冲和BOM干扰。

PHP中json_encode()失败时如何捕获错误
直接调用 json_encode() 不会抛出异常,失败时只返回 false,这是最容易被忽略的起点。必须手动检查返回值,否则前端收到 null 或空字符串,根本看不出是编码失败还是数据为空。
常见错误现象:接口返回空白响应、Chrome DevTools 中 Response 里显示「Failed to load response data」、curl -v 显示 HTTP 200 但 body 为空。
- 始终用
=== false判断失败(注意是严格比较,因为0、""、null都可能合法) - 配合
json_last_error()和json_last_error_msg()获取具体原因 - 中文字符出错?大概率是源数据含 GBK 编码或不可见控制字符(如
\x00),先用mb_convert_encoding($data, 'UTF-8', 'UTF-8')过滤一遍 - 对象中有资源(resource)、闭包(Closure)或循环引用?
json_encode()会静默失败,需提前清理或实现JsonSerializable接口
统一错误响应结构与HTTP状态码联动
不要在出错时仍返回 200 OK + 错误 JSON;前端无法靠 status 判断成败,容易掩盖问题。应让 HTTP 状态码真实反映结果。
- 业务逻辑错误(如参数缺失、权限不足)用
400 Bad Request或403 Forbidden - 服务端未预期错误(如 DB 连接失败、
json_encode()失败)用500 Internal Server Error - 写法示例:
http_response_code(400); header('Content-Type: application/json; charset=utf-8'); echo json_encode(['error' => 'Missing required field: email'], JSON_UNESCAPED_UNICODE); - 避免在多个地方重复写
header()和echo,建议封装成一个api_error($msg, $code = 400)函数
避免输出缓冲干扰JSON响应
任何非 JSON 内容(比如 Warning、Notice、echo 调试语句、BOM 字节、空格)混入响应体,都会导致前端 JSON.parse() 报 SyntaxError: Unexpected token。
立即学习“PHP免费学习笔记(深入)”;
- 上线前务必关闭
display_errors(设为Off),改用日志记录错误 - 脚本开头加
ob_end_clean()清掉之前可能存在的输出缓冲 - 确保 PHP 文件本身无 BOM:用 VS Code 或 Notepad++ 检查编码是否为「UTF-8 无 BOM」
- 敏感调试信息别用
var_dump()直接打屏,改用error_log(print_r($data, true))
兼容老版本PHP的json_encode()选项处理
JSON_UNESCAPED_UNICODE 在 PHP 5.4+ 才支持,若项目还在跑 5.3,硬加会导致 json_encode() 返回 false 且 json_last_error_msg() 显示「Unknown option」。
- 先用
defined('JSON_UNESCAPED_UNICODE')判断常量是否存在 - PHP 5.3 下中文会被转成
\u4f60,虽能解析但可读性差;如需可读,可用preg_replace_callback()解码 Unicode,但性能略损 - 更稳妥做法:升级 PHP 版本,5.3 已停止维护超十年,存在已知安全漏洞









