JSON_THROW_ON_ERROR是PHP 7.3+新增标志,使json_decode/encode出错时抛JsonException而非返回false/null;需PHP≥7.3且显式传入flags参数,低版本需defined()判断兼容。

JSON_THROW_ON_ERROR 是 PHP 7.3 引入的重要改进,它让 JSON 操作出错时不再静默返回 null 或 false,而是直接抛出 JsonException 异常,避免手动调用 json_last_error() 做错误检查。
什么时候能用这个标志
必须满足两个条件:
- PHP 版本 ≥ 7.3
- 在 json_decode() 或 json_encode() 的 flags 参数中显式传入该常量
注意:不是所有旧环境都定义了它。低版本(如 7.2 及以下)直接使用会报“undefined constant”错误。
基本用法示例
✅ 正确写法(带异常捕获):
try {
$data = json_decode('{"name": "张三", "age":}', true, 512, JSON_THROW_ON_ERROR);
} catch (JsonException $e) {
echo 'JSON 解析失败:' . $e->getMessage();
// 错误码可用 $e->getCode() 获取,对应 json_last_error() 的值
}✅ 编码也一样:
立即学习“PHP免费学习笔记(深入)”;
try {
$json = json_encode(['user' => null, 'score' => INF], JSON_THROW_ON_ERROR);
} catch (JsonException $e) {
echo 'JSON 编码失败:' . $e->getMessage();
}兼容旧版本的稳妥写法
如果你的项目要支持 PHP 7.2 或更低版本,建议先判断常量是否存在:
- 用
defined('JSON_THROW_ON_ERROR')判断是否可用 - 不可用时退回传统方式:检查返回值 +
json_last_error()
例如封装一个安全解码函数:
function safe_json_decode(string $json, bool $assoc = true, int $depth = 512): ?array
{
if (!is_string($json) || trim($json) === '') {
return null;
}
<pre class="brush:php;toolbar:false;">if (defined('JSON_THROW_ON_ERROR')) {
try {
return json_decode($json, $assoc, $depth, JSON_THROW_ON_ERROR);
} catch (JsonException $e) {
return null;
}
}
$result = json_decode($json, $assoc, $depth);
return json_last_error() === JSON_ERROR_NONE ? $result : null;}
常见错误类型和对应异常码
抛出的 JsonException 的 $code 属性,值与 json_last_error() 完全一致,比如:
-
JSON_ERROR_SYNTAX→ 语法错误(如多逗号、缺引号) -
JSON_ERROR_DEPTH→ 嵌套过深(超过depth限制) -
JSON_ERROR_UTF8→ 含非法 UTF-8 字符(未加JSON_INVALID_UTF8_IGNORE等处理)
你可以用 match ($e->getCode()) { ... } 做精细化错误处理。



















