You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:01:30