JSON_ERROR_DEPTH表示JSON解析时嵌套层级超出上限,PHP默认限制为512层,每进入一个对象或数组即增加一层深度;超限后返回null并触发该错误,需通过json_last_error()检测,不可仅凭返回值是否为null判断。

JSON_ERROR_DEPTH 表示 JSON 解析时“到达了最大堆栈深度”,也就是嵌套层级超出了 json_decode() 允许的上限。
为什么会触发这个错误
PHP 默认限制 JSON 结构最多嵌套 512 层。每进入一个对象 {} 或数组 [] 就算一层深度。当实际嵌套层数超过设定值(包括默认的 512),解析就会中断,函数返回 null,并让 json_last_error() 返回 JSON_ERROR_DEPTH。
- 不是语法错误,JSON 字符串本身可能是完全合法的
- 常见于自动生成的配置、递归导出的数据、或恶意构造的超深结构
- PHP 触发该错误的同时,通常还会抛出 warning:“Maximum stack depth exceeded”
怎么确认是这个错误
解码后必须主动检查错误状态:
$data = json_decode($json, true);
if (json_last_error() === JSON_ERROR_DEPTH) {
echo '嵌套太深,需调高 $depth 参数';
}
注意:不能只靠判断返回值是否为 null,因为原始 JSON 本身就可能是 null,也可能是空字符串或非法格式,它们都可能返回 null。
立即学习“PHP免费学习笔记(深入)”;
如何解决
在调用 json_decode() 时显式传入更大的 $depth 值:
- 第三个参数就是深度限制,例如
json_decode($json, true, 1024)允许最多 1024 层 - 建议留出余量,比如预期最深 200 层,可设为 300 或 500
- 不推荐无限制增大(如设为 10000),以防恶意输入耗尽内存或引发栈溢出
安全提醒
深度限制本身是一种防护机制:
- 防止 DoS 攻击:攻击者发送超深 JSON 可能导致服务卡死或崩溃
- 对不可信来源(如用户上传、第三方 API)应前置校验或设保守深度(如 64 或 128)
- 生产环境不建议直接用
json_decode($json, true, 999999)一劳永逸



















