PHP中json_decode解析失败默认返回null且不抛异常,须立即调用json_last_error()和json_last_error_msg()获取错误码与描述;PHP 8.0+可启用JSON_THROW_ON_ERROR参数抛JsonException;还需验证UTF-8编码并排查BOM、控制字符等隐藏问题。

PHP 7.4 和 8.1 中 json_decode 解析失败时,默认不抛出异常,需主动检查错误并获取具体原因。
使用 json_last_error() 和 json_last_error_msg()
这是最常用、兼容性最好的方式。每次调用 json_decode 后立即检查错误状态:
-
json_last_error()返回整型错误码(如JSON_ERROR_SYNTAX) -
json_last_error_msg()返回对应可读的错误描述(PHP 5.5+ 支持,7.4/8.1 均可用)
示例:
<?php$json = '{ "name": "张三", "age": }'; // 缺少值,语法错误
$result = json_decode($json, true);
if ($result === null && json_last_error() !== JSON_ERROR_NONE) {
echo '解析失败:' . json_last_error_msg(); // 输出:解析失败:Syntax error
}
?>
PHP 8.0+ 推荐:启用 throw_on_error 参数(仅限 8.0 及以上)
PHP 8.0 新增了第四个参数 throw_on_error,设为 true 可让 json_decode 在失败时直接抛出 JsonException:
立即学习“PHP免费学习笔记(深入)”;
- PHP 8.1 完全支持该参数;PHP 7.4 不支持,会报错“Unknown named parameter”
- 捕获异常后可通过
$e->getMessage()获取错误信息
示例(PHP 8.1):
<?php$json = '{"invalid": json}';
try {
$result = json_decode($json, true, 512, JSON_THROW_ON_ERROR);
} catch (JsonException $e) {
echo 'JSON 错误:' . $e->getMessage();
}
?>
验证输入字符串是否为合法 UTF-8(常见隐藏原因)
即使 JSON 语法正确,若字符串含非法 UTF-8 字节(如 GBK 编码的中文混入),json_decode 也会静默失败(返回 null,错误码为 JSON_ERROR_UTF8):
- 用
mb_check_encoding($json, 'UTF-8')预检编码 - 必要时用
mb_convert_encoding($json, 'UTF-8', 'auto')转换 - 注意:转换可能改变原始内容,需结合业务判断是否安全
调试小技巧:打印原始字节和长度
当错误信息不够明确时,可辅助排查:
- 用
bin2hex(substr($json, 0, 20))查看前 20 字节十六进制,识别 BOM 或乱码 - 用
strlen($json)和mb_strlen($json, 'UTF-8')对比,判断是否含不可见控制字符 - 用
var_dump(json_encode($json))看是否被二次转义(比如传入的是已转义过的 JSON 字符串)



















