PHP中Curl获取API的JSON响应无法解码的问题求助
问题
我用以下PHP Curl代码调用API获取数据:
$curl = curl_init(); //adding fields to the curl object to enter the site curl_setopt($curl, CURLOPT_URL, $my_url); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); //executing the curl call and getting data back $jsonStr = curl_exec($curl); curl_close($curl); // close the connection print_r($jsonStr);
请求能正常返回JSON格式响应,但使用下面的代码无法解析取值,反而输出完整JSON数组:
$code = json_decode($jsonStr ,true); echo $code[0]['id'];
但如果把这个JSON字符串手动赋值给变量后,json_decode却能正常工作。作为PHP、Curl、JSON新手,我猜测可能是单引号问题,希望得到帮助。
解决方案
兄弟,你这个问题跟单引号没啥关系,核心问题大概率出在Curl的返回设置上,我给你一步步拆解:
1. 先解决最关键的Curl配置缺失
默认情况下,curl_exec()会直接把API的响应内容输出到浏览器,而不是把它赋值给$jsonStr变量!你看到的print_r($jsonStr)输出其实是Curl直接打印的响应,而$jsonStr本身可能只是个布尔值(请求成功时是true,失败时是false),这时候用json_decode去解析一个布尔值,肯定得不到你想要的结果!
赶紧给你的Curl加上这个关键选项:
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
加上之后,curl_exec()才会把响应内容以字符串形式返回给$jsonStr,而不是直接输出。
2. 排查可能存在的隐形字符问题
如果加了上面的选项还是不行,那可能是API返回的JSON字符串前后藏了BOM(字节顺序标记)、空格、换行这类看不见的字符,手动赋值的时候你可能无意中把这些字符删掉了,所以能正常解析。
可以先对$jsonStr做个清理:
// 去除BOM和首尾的空白、换行符 $jsonStr = trim($jsonStr, "\xEF\xBB\xBF \t\n\r");
然后再配合错误排查函数,看看解析过程中有没有问题:
$code = json_decode($jsonStr, true); if (json_last_error() !== JSON_ERROR_NONE) { echo "JSON解析失败:" . json_last_error_msg(); } else { echo isset($code[0]['id']) ? $code[0]['id'] : '数组索引不存在'; }
用json_last_error_msg()能快速定位到底是JSON格式有问题,还是变量本身的问题。
3. 给新手的额外小提醒
- 尽量别用
CURLOPT_SSL_VERIFYPEER, 0,这会关闭SSL证书验证,存在安全风险!本地测试可以暂时用,但正式环境一定要去掉,或者配置正确的CA证书路径。 - 每次Curl请求后,最好检查一下请求是否有错误:
if(curl_errno($curl)){ echo 'Curl请求错误:' . curl_error($curl); }
内容的提问来源于stack exchange,提问作者Vec
相关产品推荐
相关产品推荐

