json_decode返回空数组[]通常因输入JSON本身为空数组、误用JSON_FORCE_OBJECT后强转,或未检查解析失败而误判null为[];实际失败时返回null,需用json_last_error()定位语法、编码、深度等错误。

PHP 中 json_decode 返回空数组([]),通常不是因为“解码失败返回空数组”,而是你可能误判了返回值——json_decode 在解析失败时默认返回 null,而不是空数组。如果你确实得到了一个空数组 [],那说明 JSON 字符串本身内容就是 [],或者你用了 JSON_FORCE_OBJECT 但原始 JSON 是空数组,被强制转成了空对象再强转为数组(需注意类型转换逻辑)。
检查 JSON 字符串是否合法且非空
最常见的原因是传入了空字符串、null、HTML 内容、BOM 头或语法错误的 JSON。
- 用
trim($json)去除首尾空白和 BOM(如\xEF\xBB\xBF) - 用
json_last_error()和json_last_error_msg()查具体错误 - 打印原始字符串:用
var_dump(bin2hex($json))看是否有隐藏字符 - 在线工具(如 jsonlint.com)校验 JSON 格式是否正确
确认是否启用了 JSON_FORCE_OBJECT
如果调用写成 json_decode($json, true, 512, JSON_FORCE_OBJECT)(注意第4个参数是 flag),而原始 JSON 是 [],它会被强制解析为 stdClass 对象;若后续又用 (array) 强转,会得到空数组(因空对象转数组后无属性)。更典型的是:
json_decode('[]', false, 512, JSON_FORCE_OBJECT) → 返回 stdClass 对象
(array) json_decode('[]', false, 512, JSON_FORCE_OBJECT) → 得到 []
注意编码与中文乱码问题
JSON 字符串含中文但编码不是 UTF-8(如 GBK),会导致解析失败返回 null;若你没检查 json_last_error() 就直接 print_r,而变量恰好是未初始化的数组,可能误以为输出了空数组。
解决方法:
- 确保输入字符串是 UTF-8 编码:
$json = mb_convert_encoding($json, 'UTF-8', 'auto') - 避免从 HTML 表单、文件读取、cURL 响应中直接取值而不清理编码
检查是否混淆了关联数组与对象模式
json_decode($json, true) 返回关联数组,json_decode($json)(第二个参数为 false 或省略)返回对象。如果你期望数组却忘了加 true,又对对象做了 print_r([]) 类似操作,可能误读结果。另外,某些框架(如 Laravel)的响应可能自动包装了 JSON,比如外层是 {"data": [...]},你解码后取 $arr['data'] 才是目标数组,直接解码顶层可能是个带 key 的对象。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











