直接用json_decode($json_string, true)将JSON转为关联数组,否则返回对象需用->访问;务必检查file_get_contents或curl是否成功、响应是否为200且Content-Type含application/json、JSON是否UTF-8无BOM及非法字符,并调用json_last_error()排查解析失败原因。

PHP用file_get_contents获取JSON后怎么转数组
直接用json_decode就行,但必须传true作为第二个参数,否则返回的是对象而非数组。
常见错误是漏掉这个参数,结果代码里用$data['key']报错,因为实际是$data->key。
-
json_decode($json_string, true)→ 关联数组(推荐,符合多数PHP习惯) -
json_decode($json_string)→stdClass对象(需用->访问) - 如果JSON含中文,确保原始字符串是UTF-8编码,否则
json_decode会返回null - 调用前务必检查
file_get_contents是否成功,失败时返回false,直接丢给json_decode会导致警告
curl请求返回JSON时如何安全转数组
比file_get_contents多一步:要确认HTTP响应状态码是200,且Content-Type含application/json,否则可能拿到HTML错误页或空响应。
示例关键逻辑:
立即学习“PHP免费学习笔记(深入)”;
if ($httpCode === 200 && strpos($contentType, 'application/json') !== false) {
$data = json_decode($responseBody, true);
if (json_last_error() !== JSON_ERROR_NONE) {
// 解析失败,可能是格式错、BOM头、非UTF-8等
}
}
-
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true)必须设,否则curl_exec输出到屏幕而非返回字符串 - 建议加
curl_setopt($ch, CURLOPT_TIMEOUT, 10)防卡死 - 某些API返回带BOM的UTF-8 JSON,可用
ltrim($responseBody, "\xEF\xBB\xBF")清理
json_decode返回null却不报错?排查这三点
这是最常卡住人的地方。PHP默认不抛异常,只设错误码,得手动查。
- 用
json_last_error()和json_last_error_msg()看具体原因(如JSON_ERROR_SYNTAX) - 确认输入不是
null或空字符串——file_get_contents失败、curl超时、网络中断都会导致空响应 - 检查JSON是否含非法字符:比如Windows换行符
\r\n混在字段值里,或前端没过滤用户输入的控制字符
用json_decode转数组时的性能与兼容性注意点
对普通接口响应(几KB到几百KB),性能差异可忽略;但若处理MB级JSON,要注意内存和深度限制。
- PHP 7.4+ 默认最大深度为512,嵌套太深会截断,可传第三个参数调整:
json_decode($json, true, 1024) - PHP 8.0+ 支持
JSON_THROW_ON_ERROR标志,让解析失败直接抛JsonException,比查错误码更直观 - 如果目标数组后续要频繁写入,别用
json_decode($json, true)后直接foreach修改——关联数组是值拷贝,大数组会吃内存;改用引用或分块处理
真正容易被忽略的是错误静默:没检查json_last_error()就往下用,结果数据缺失却找不到源头。每次json_decode后加一行判断,省去半天排查时间。











