PHP 8.5.5 的 json_decode 出错并非版本问题,根源在于数据本身或调用方式:需立即调用 json_last_error() 查错,注意空字符串、BOM、UTF-8非法字节、读取截断等常见原因。

PHP 8.5.5 的 json_decode 出错,不是版本问题——这个版本本身对 JSON 解析没有引入破坏性变更,出错根源仍在数据本身或调用方式上。
json_decode 返回 null 但没报错?先查 json_last_error()
PHP 不会自动抛异常,json_decode() 失败只返回 null,你得主动问它为什么失败。
- 必须在
json_decode()后**立刻**调用json_last_error(),中间不能夹任何其他 JSON 操作(包括json_encode()、甚至某些扩展的内部调用) -
JSON_ERROR_NONE并不等于“成功”:输入是空字符串、纯空白、或"null"字符串时,也返回null且错误码为JSON_ERROR_NONE,所以要先trim($json)+strlen()校验 - 常见真实原因:
JSON_ERROR_SYNTAX往往不是括号漏了,而是 BOM 头、\u0000控制字符、或中文全角标点混入;JSON_ERROR_UTF8表示字节流非法,不是简单转码就能救,得先用mb_convert_encoding($s, 'UTF-8', 'UTF-8')清洗一遍
读文件后直接 json_decode 失败?检查 file_get_contents 是否截断
远程 API 或本地文件读取后看似是完整 JSON,实际可能被 silently 截断,尤其当内容含二进制或特殊控制符时。
- 用
var_dump(strlen($json))和原始文件大小对比,确认是否读全 - 如果来源是 cURL,检查是否漏设
CURLOPT_RETURNTRANSFER => true,否则curl_exec()返回bool(true)而非字符串 - 若文件含 BOM(如 UTF-8 with BOM),
file_get_contents会原样读入,导致开头三个字节\xEF\xBB\xBF破坏 JSON 结构,可用ltrim($json, "\xEF\xBB\xBF")剥离
传参写成 $json_encode 导致 fatal error?这是变量名拼写错误
不是解析失败,是根本没走到 json_decode——你把函数名写成了变量。
立即学习“PHP免费学习笔记(深入)”;
- 错误写法:
file_put_contents('x.json', $json_encode($data));→ PHP 报Fatal error: Uncaught Error: Call to a member function ... on null,因为$json_encode未定义,默认是null - 正确写法:
file_put_contents('x.json', json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT)); - 别依赖 IDE 自动补全:有些编辑器对
json_*函数补全不敏感,手敲时多看一眼有没有$
真正麻烦的从来不是函数怎么用,而是你拿到的那串“看起来像 JSON”的字符串,到底是不是合法 UTF-8、有没有隐藏控制符、是否被中间层(比如 nginx proxy_buffers、cURL timeout、MySQL TEXT 字段截断)悄悄动过手脚——这些地方不排查,光调参数没用。



















