必须立即调用json_last_error()检查错误码,不能仅依赖null判断;常见错误包括json_error_syntax(bom或控制字符)、json_error_utf8(非法utf-8字节)、json_error_depth(嵌套过深),且json_error_none时输入可能为空或纯空白。

json_decode() 返回 null 时,怎么知道哪里出错了
PHP 的 json_decode() 在解析失败时默认只返回 null,不抛异常,也不带错误信息。光看 null 无法判断是 JSON 格式错、编码不对,还是空字符串或纯空白。必须配合 json_last_error() 和 json_last_error_msg() 才能定位问题。
必须在 json_decode() 后立刻调用 json_last_error()
json_last_error() 是全局状态函数,它的值会在每次 JSON 相关操作后被覆盖。如果中间夹了其他 json_encode()、json_decode() 或甚至某些扩展的内部 JSON 调用(比如 curl_setopt($ch, CURLOPT_POSTFIELDS, $data) 自动处理时),错误码就丢了。
正确做法是:
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
- 紧接在
json_decode()后立即调用json_last_error(),中间不要穿插任何其他 JSON 操作 - 推荐把解析和错误检查写成连续两行,避免意外干扰
- 示例:
$data = json_decode($json_string);<br>if (json_last_error() !== JSON_ERROR_NONE) {<br> throw new InvalidArgumentException('JSON 解析失败:' . json_last_error_msg());<br>}
常见错误码对应的真实原因和修复方式
json_last_error() 返回整数,需与常量比对。几个高频错误要特别注意:
-
JSON_ERROR_SYNTAX:最常见,但不一定是引号或括号漏了——可能是 UTF-8 BOM 头、不可见控制字符(如\u0000)、或混合了中文全角标点。用trim($json_string)+mb_detect_encoding()检查编码再试 -
JSON_ERROR_UTF8:字符串声称是 UTF-8,实际含非法字节。不是简单转码就能解决,得先用mb_convert_encoding($json_string, 'UTF-8', 'UTF-8')清洗,再解析 -
JSON_ERROR_DEPTH:嵌套太深(默认限制 512 层)。PHP 7.3+ 可传第 3 个参数$depth调整,但更可能是数据结构异常,应先检查来源 -
JSON_ERROR_NONE不代表成功——如果输入是空字符串、"null"或纯空白,json_decode()也返回null且错误码为JSON_ERROR_NONE。务必先用trim()和strlen()做前置校验
json_last_error_msg() 的兼容性陷阱
json_last_error_msg() 从 PHP 5.5 开始才有,低版本会 fatal error。线上环境若还跑着 PHP 5.3/5.4,不能直接用。安全写法是:
- 先判断 PHP 版本:
function_exists('json_last_error_msg') - 降级方案:自己维护一个错误码到消息的映射数组,覆盖常见错误(
JSON_ERROR_SYNTAX→ "Syntax error" 等) - 注意:该函数返回的是英文字符串,且内容可能随 PHP 小版本微调,不适合做 switch 分支逻辑,仅用于日志或调试输出
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










