json_encode()默认不抛异常而返回false,须手动检查并throw;php 7.3+可启用json_throw_on_error自动抛jsonexception,但仍需try-catch;常见失败原因包括非utf-8字符串、资源、循环引用等。

PHP 的 json_encode() 函数本身**不会抛出异常**,它在出错时默认返回 false,并设置一个错误码(可通过 json_last_error() 或更推荐的 json_last_error_msg() 获取错误信息)。
如果你希望它“抛异常”,需要**手动检查返回值并主动 throw**。这是最常用、最清晰的做法。
判断返回值 + 手动 throw 异常
这是推荐方式:调用 json_encode() 后立即检查是否为 false,是则抛出自定义异常或内置异常。
- 适用于所有 PHP 版本(包括较老版本)
- 逻辑明确,调试友好
- 可携带原始错误信息,便于定位问题(比如中文字符未 UTF-8 编码、资源类型、循环引用等)
示例:
php$data = ['name' => '张三', 'info' => fopen('/tmp/test', 'r')]; // 含资源,无法 JSON 化
$result = json_encode($data);
if ($result === false) {
throw new RuntimeException('JSON 编码失败:' . json_last_error_msg());
}
echo $result;
?>
封装成安全的 encode 函数
为避免重复写判断逻辑,可封装一个“强校验”版本:
$result = json_encode($value, $flags);
if ($result === false) {
$msg = json_last_error_msg();
throw new JsonException("JSON encode error: {$msg} (code: " . json_last_error() . ")");
}
return $result;
}
使用:safe_json_encode(['user' => $obj]) —— 出错直接中断并带上下文。
PHP 7.3+ 可配合 JSON_THROW_ON_ERROR 标志(仍需 try-catch)
PHP 7.3 起支持 JSON_THROW_ON_ERROR 标志,启用后,json_encode() 在失败时会**自动抛出 JsonException**(继承自 RuntimeException)。
但注意:它只对编码过程中的“数据不可序列化”类错误生效(如资源、不可序列化对象),不覆盖所有错误场景(例如部分扩展错误仍可能返回 false);且你仍需用 try/catch 捕获。
$json = json_encode($badData, JSON_THROW_ON_ERROR);
} catch (JsonException $e) {
error_log('JSON error: ' . $e->getMessage());
throw $e;
}
?>
常见导致 json_encode 失败的原因(便于排查)
- 数据含 资源类型(如
fopen返回的 resource) - 存在 循环引用对象(对象 A → B → A)
- 字符串不是 UTF-8 编码(尤其中文 GBK/GB2312 字符)
- 数组键名含 非法字符(虽少见,但某些扩展下可能触发)
- 数据嵌套过深或超大(内存限制或
max_depth超限)
建议:对输入数据做预处理(如用 mb_convert_encoding() 统一转 UTF-8,用 is_scalar()/is_array() 过滤非法类型),比单纯依赖异常更健壮。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











