PHP的json_decode()默认不抛异常,解析失败返回null并设置错误码;推荐手动检查null且json_last_error()≠JSON_ERROR_NONE,或PHP 7.3+启用JSON_THROW_ON_ERROR标志。

PHP 的 json_decode() 函数本身**不会抛出异常**(Exception),它在解析失败时默认返回 null,并设置 json_last_error() 和 json_last_error_msg()。若想让它“抛异常”,需手动检查解析结果并主动 throw。
判断是否解析失败并抛异常
最常用、推荐的方式:调用 json_decode() 后立即检查返回值是否为 null,再结合 json_last_error() !== JSON_ERROR_NONE 确保是真错误(排除原始 JSON 就是 null 的情况):
- 先解析:
$data = json_decode($json, true); - 再检查:
if ($data === null && json_last_error() !== JSON_ERROR_NONE) { throw new InvalidArgumentException('JSON 解析失败:' . json_last_error_msg()); } - 注意用
=== null(严格比较),避免把空数组、false、0等误判为失败
封装成可复用的函数
为避免重复写检查逻辑,可封装一个安全版解码函数:
function json_decode_safe(string $json, bool $assoc = true): mixed
{
$data = json_decode($json, $assoc);
if ($data === null && json_last_error() !== JSON_ERROR_NONE) {
throw new InvalidArgumentException(
sprintf('JSON 解析失败(%s):%s', json_last_error(), json_last_error_msg())
);
}
return $data;
}
// 使用
try {
$arr = json_decode_safe('{"name":"张三","age":25}');
} catch (InvalidArgumentException $e) {
// 处理异常
error_log($e->getMessage());
}
PHP 7.3+ 可选:启用 JSON_THROW_ON_ERROR(更简洁)
从 PHP 7.3 起,json_decode() 支持第 3 个参数 JSON_THROW_ON_ERROR,开启后解析失败直接抛 JsonException:
立即学习“PHP免费学习笔记(深入)”;
$data = json_decode($json, true, 512, JSON_THROW_ON_ERROR);- 注意:第 3 个参数是
depth(最大嵌套深度),第 4 个才是 flag,不能省略 depth - 必须捕获
JsonException(它继承自RuntimeException)
示例:
try {
$data = json_decode($json, true, 512, JSON_THROW_ON_ERROR);
} catch (JsonException $e) {
throw new InvalidArgumentException('JSON 格式错误:' . $e->getMessage());
}
常见误判点提醒
以下情况容易被当成“解析失败”,但其实不是:
- 原始 JSON 是字符串
"null"→json_decode("null")返回null,但json_last_error() === JSON_ERROR_NONE - JSON 中有 UTF-8 BOM 或不可见控制字符 → 导致解析失败,建议用
trim($json, "\xEF\xBB\xBF")清除 BOM - 使用了单引号或中文引号 → JSON 必须用英文双引号,否则报错



















