json_decode()返回null的五大原因及修复步骤:一、检查json语法合法性并用json_last_error()定位错误;二、验证并转换为utf-8编码,清除bom;三、确认字符串未被截断;四、移除不可见控制字符;五、禁用@错误抑制符。

常见错误码与说明
JSON_ERROR_NONE:无错误。注意:返回 null 却得到此码,往往说明输入本身是合法 JSON 字符串但内容为原始 null(如 "null"),需结合上下文判断,不是解析失败。
JSON_ERROR_SYNTAX:语法错误。最常见,例如:
- 使用单引号代替双引号(
{'name': 'Alice'}) - 对象或数组末尾多了一个逗号(
{"a":1,}) - 字符串未闭合、括号不匹配、未转义双引号(
{"msg":"he said "hi"!"})
JSON_ERROR_UTF8:存在非法 UTF-8 字符。典型场景包括:
- 字符串含 Windows-1252 编码的引号、破折号(如 Word 粘贴的“弯引号”)
- 二进制数据混入、BOM 头(
\xEF\xBB\xBF)、控制字符(\x00–\x08, \x0B, \x0C, \x0E–\x1F) - MySQL 查询未设
utf8mb4导致 emoji 或生僻字截断
JSON_ERROR_DEPTH:嵌套层级超限。PHP 默认最大深度为 512 层。若解析极深结构(如递归树、不当生成的配置),会触发此错。可通过第三个参数显式增大,例如:json_decode($json, true, 1024)。
JSON_ERROR_CTRL_CHAR:遇到意外控制字符。通常因编码污染或文本编辑器插入不可见字符(如 `\r`, `\n`, `\t` 在非字符串位置,或零宽空格 U+200B)导致。比 JSON_ERROR_UTF8 更聚焦于 ASCII 控制范围内的非法出现。
JSON_ERROR_STATE_MISMATCH:JSON 状态异常。多见于解析流式不完整数据、或传入了无法被识别的 token(如开头就是 `//` 注释、或 JS 风格的 `undefined`),也可能是内存损坏等底层问题,相对少见。
其他实用错误码
JSON_ERROR_RECURSION:待编码值中含循环引用(仅 json_encode() 可能触发)。
JSON_ERROR_INF_OR_NAN:尝试编码 INF、-INF 或 NAN 值(PHP 不允许 JSON 表示这些)。
JSON_ERROR_UNSUPPORTED_TYPE:传入了资源(resource)、闭包(closure)等无法序列化的类型(json_encode() 场景)。
怎么用才靠谱
不要只靠 if (!$data) 判断失败——因为合法 JSON 的空数组 []、空对象 {}、布尔 false、数字 0 都可能被转换后为 falsy 值。
正确做法是:
- 始终在
json_decode()后立刻调用json_last_error() - 优先使用
JSON_THROW_ON_ERROR(PHP ≥ 7.3)让错误显性化:$data = json_decode($json, true, 512, JSON_THROW_ON_ERROR); - 对用户输入或外部 API 返回的 JSON,先用
json_validate($json)(PHP ≥ 8.0)预检,避免解析开销
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











