调第三方接口拿到一串 JSON,var_dump 出来却是 NULL,八成是 php json_decode 的用法不对。这个函数负责把 JSON 字符串转成 PHP 变量,用法不复杂,坑集中在参数选择和报错排查上。
返回对象还是数组
$data = json_decode($json); $arr = json_decode($json, true);
第二个参数决定返回类型:不传或传 false 拿到对象,取值用 $data->name;传 true 拿到关联数组,取值用 $arr['name']。业务代码里更常见传 true,数组函数多、遍历方便。
第三个参数是递归深度,默认 512,正常业务碰不到上限;第四个参数是标志位常量,比如处理超大整数时传 JSON_BIGINT_AS_STRING,避免超出 PHP 整数范围的数字被转成浮点丢精度。
返回 NULL 时的排查
解析失败它不报错,直接返回 NULL,要看真实原因得配合两个函数:json_last_error() 返回错误码,json_last_error_msg() 返回能看懂的错误说明,定位问题基本靠它。
- 引号不对:JSON 标准要求键名和字符串值都用英文双引号,单引号或中文引号直接解析失败
- 末尾多逗号:数组或对象最后一个元素后面带了逗号,前端看着没事,decode 就挂
- 字符串带了 BOM 头或看不见的空白字符,多半是编辑器保存格式的问题
- 被解析的压根不是 JSON,比如接口返回了 HTML 错误页,先打印原始内容确认
实际建议:解析外来 JSON 后先检查 json_last_error 再动手,失败就记日志别硬用;接受用户提交的 JSON 时限制深度和大小,防止超深嵌套把内存打爆。php json_decode 记住三件事:第二参数传 true 用数组、失败返 NULL、出错查 json_last_error_msg。