使用 cURL 抓取 JSON 文本时无法解析?

Posted

技术标签:

【中文标题】使用 cURL 抓取 JSON 文本时无法解析?【英文标题】:JSON text unparseable when using cURL to grab it? 【发布时间】:2016-04-07 13:27:27 【问题描述】:

我有这个非常长的 JSON 字符串:http://pastebin.com/2jJKSGHs,它是从音乐 API 中提取的。

我设置了这段代码来解析它(http://pastebin.com/EuJtuhHg):

$url = "https://api.discogs.com/database/search?type=artist&q=pink[keyandsecretredacted]"; 

//initialize the session
$ch = curl_init();

//Set the User-Agent Identifier
curl_setopt($ch, CURLOPT_USERAGENT, 'YourSite/0.1 +http://your-site-here.com');

//Set the URL of the page or file to download.
curl_setopt($ch, CURLOPT_URL, $url);

//Ask cURL to return the contents in a variable instead of simply echoing them
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

//Execute the curl session
$output = curl_exec($ch);

//close the session
curl_close ($ch);


//decode and print output
$output = json_decode($output2, true);
echo($output['results'][0]['title']);

当我将 JSON 字符串的内容直接插入到我的代码中时,json_decode 可以完美地处理它。但是当我尝试使用上面的方法从 API 中获取它时,我的页面上什么也没有打印——它只是空的。打印出 json_last_error 返回“0”,所以它没有检测到任何错误。

任何想法为什么会发生这种情况?

【问题讨论】:

我将原始 pastebin 的内容复制到 json 文件中,将其导入到变量中,使用 json_decode,它运行良好。如果 json_decode 对您不起作用,您的代码中还有其他原因会导致错误。 你是对的。我应该在发布之前测试一下。当我将文本直接插入代码时效果很好。由于此文本来自 API,因此我使用 curl 来获取它(pastebin.com/EuJtuhHg)。 /然后/它不起作用。它实际上没有在页面上打印任何内容,当我运行 json_last_error() 它说没有错误。我认为撇号是由于不同的原因造成的,但现在我想知道它是否还有其他原因。 啊,我很高兴我回来看看你改变了你展示的东西。您的代码中没有真正的“错误”。你在$output2 上调用json_decode,它什么都不包含,你想在$output 上调用它,它完美地工作^^ 你可以var_export $output的$output = curl_exec($ch); 另外,要么删除这个问题,要么标记它,以便模组可以从帖子历史记录中删除你的 api 密钥和秘密。 【参考方案1】:

替换

$output = curl_exec($ch);

$output2 = curl_exec($ch);

否则$output2 未定义,json_decode 使用未定义变量:

$output = json_decode($output2, true);

【讨论】:

不,我针对他们的 API 运行了您的原始代码,并且运行良好。如果你尝试类似https://google.com 会发生什么? @matthew 这不是 API,在我的家庭系统和服务器以及 phpFiddle 上完美运行。这是您在 XAMPP 中使用 curl 设置的 ^^ @matthew 试试https://google.com。从我在这里和 cmets 看到的所有内容来看,我怀疑 curl 是如何处理您的 SSL 连接(或 PHP 本身)的。可能通过 https 使用 file_get_contents 进行测试,如果通过 curl 执行此操作不起作用并且如果这不起作用,但对于非 https 有效,请专门查看 SSL 连接。我在很多项目中都使用 OpenSSL,所以我必须做的可能是相同的要求,但我不确定。不过它会给你一个很好的方向。 仅出于调试目的,请尝试以下curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);(不建议在生产代码中使用!!)。如果它适用于该行,则意味着由于某种原因没有使用任何证书设置 Curl。我还建议打开所有错误报告,这样您就可以查看它是否报告了“SSL 证书问题”之类的内容 @matthew 是的,许多共享托管服务器将不允许您使用 file_get_contents 抓取网页(或者,在大多数情况下,任何 file 类命令)

以上是关于使用 cURL 抓取 JSON 文本时无法解析?的主要内容,如果未能解决你的问题,请参考以下文章

无法使用请求从 zillow 中抓取自定义属性链接

无法解析代理:POST(在运行 curl 脚本进行 watson 文档转换时)

快速解析时无法在json post请求参数中添加文本字段输入的文本

C# |从 URL 抓取 JSON 无法将字符串转换为 int

无法使用 Twitter API、PHP 和 curl 发布图像和文本?媒体/上传和状态/更新

linux shell中curl 发送post请求json格式问题