json_decode默认返回stdclass对象而非数组,需显式传true才能得到关联数组;解析失败时静默返回null,须用json_last_error()检查错误,常见原因包括语法错误、utf-8 bom、编码不匹配等。

json_decode 默认返回对象,不是数组
直接调用 json_decode($json) 得到的是 stdClass 对象,不是你想要的关联数组。这是最常踩的坑——以为能直接用 $data['key'] 访问,结果报错 “Cannot use object of type stdClass as array”。
根本原因:PHP 的 json_decode 默认第二个参数是 false,即不转成数组。
- 要得到数组,必须显式传入
true作为第二个参数:json_decode($json, true) - 如果 JSON 是多层嵌套,
true会让所有层级都转成关联数组(包括原本的数组结构) - 注意:含数字索引的 JSON 数组(如
[1,2,3])在true模式下仍会变成 PHP 索引数组,不是关联数组
遇到 null 时先检查 json_last_error()
json_decode 解析失败不会抛异常,而是静默返回 null。你看到 null,不等于 JSON 为空字符串或 "null",很可能是格式错误。
使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。
- 立刻跟一句
json_last_error()查具体错误码,比如JSON_ERROR_SYNTAX表示语法错误 - 常见诱因:中文引号、尾部多余逗号、未转义的换行符、BOM 头(尤其从文件读取时)
- 调试建议:用
var_dump(json_last_error_msg())直接看可读错误信息
处理 UTF-8 BOM 和非标准编码
从文件或接口拿到的 JSON 字符串如果带 UTF-8 BOM(\xEF\xBB\xBF),json_decode 会直接失败返回 null,且 json_last_error() 可能返回 JSON_ERROR_UTF8。
- 安全做法:解码前先去除 BOM:
$json = ltrim($json, "\xEF\xBB\xBF"); - 如果源数据是 GBK/GB2312,必须先转 UTF-8:
mb_convert_encoding($json, 'UTF-8', 'GBK') - 不要依赖
iconv,它对非法字节容易崩溃;mb_convert_encoding更健壮
空值、布尔值和数字的类型映射要心里有数
json_decode($json, true) 转出来的数组,内部值类型基本和 JSON 原文一致,但有几个细节容易误判:
-
null→ PHPnull;true/false→ PHP 布尔值(不是字符串"true") - 纯数字字符串如
"123"→ 还是字符串;只有不带引号的123才是整型 - 超大整数(如微博 UID)可能被转成浮点数丢失精度——PHP 7.1+ 支持
JSON_BIGINT_AS_STRING选项:json_decode($json, true, 512, JSON_BIGINT_AS_STRING)
真正难的不是怎么转,而是转完之后没检查 json_last_error(),或者把带 BOM 的字符串直接丢进去——这两点漏掉,后面所有逻辑都白搭。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










