调用API后用json_decode()转PHP数组失败,is_array检测不通过
为什么json_decode后is_array()检测始终返回false?
这问题我一眼就抓准核心了——你用cURL的时候漏掉了一个关键选项,导致$result根本不是你以为的JSON字符串!
问题根源:cURL的默认行为坑了你
curl_exec()默认会直接把API的响应内容输出到浏览器,而不是将其作为字符串返回给变量$result。所以你的$result实际上是个布尔值:请求成功时返回true,失败时返回false。
你对着这个布尔值执行json_decode(),得到的结果自然不是数组——比如json_decode(true)会返回null,json_decode(false)也返回null,这就解释了为什么is_array()检测始终失败。
修正后的完整代码
只需要给cURL添加CURLOPT_RETURNTRANSFER选项,让它把响应内容返回给变量,而不是直接输出:
$ch = curl_init("https://api.url.com/value/value"); // 添加这个关键选项!让cURL返回响应字符串而非直接输出 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json' , "token")); $result = curl_exec($ch); // 先检查cURL请求是否成功 if ($result === false) { die('cURL请求失败: ' . curl_error($ch)); } curl_close($ch); // 解码为关联数组(第二个参数传true) $decoded = json_decode($result, true); // 检查JSON解码是否成功 if (json_last_error() !== JSON_ERROR_NONE) { die('JSON解码失败: ' . json_last_error_msg()); } // 现在再检测就正常了 if (is_array($decoded)) { echo "是数组"; } else { echo "不是数组"; }
额外提醒
- 永远要检查cURL请求和JSON解码的错误,这能帮你快速定位问题,避免瞎调试。
- 如果你不用
json_decode的第二个参数,解码后会得到对象而不是数组,这时候is_array()也会返回false,但你已经试过两种方式,所以核心问题还是cURL的选项缺失。
内容的提问来源于stack exchange,提问作者zoefrankie
相关产品推荐
相关产品推荐

