使用 PHP、curl 解码从 Flickr API 返回的 json 字符串
Posted
技术标签:
【中文标题】使用 PHP、curl 解码从 Flickr API 返回的 json 字符串【英文标题】:Decode json string returned from Flickr API using PHP, curl 【发布时间】:2011-02-14 16:44:07 【问题描述】:我试图在我的 php 代码中解码从 flickr 返回的 json 字符串。我使用 CURL,但即使我将 json_decode() 包裹在 json sring 变量周围,它也会继续返回一个字符串。有什么想法吗?
$api_key = '####';
$photoset_id = '###';
$query = 'http://api.flickr.com/services/rest/?&method=flickr.photosets.getPhotos&api_key='.$api_key.'&photoset_id='.$photoset_id.'&extras=url_o,url_t&format=json&jsoncallback=1';
$ch = curl_init(); // open curl session
// set curl options
curl_setopt($ch, CURLOPT_URL, $query);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($ch); // execute curl session
curl_close($ch); // close curl session
var_dump(json_decode($data));
【问题讨论】:
响应是什么样的? 【参考方案1】:您的请求 URL 以:
结尾&format=json&jsoncallback=1';
参数的正确名称是 nojsoncallback,因此您应该使用的正确 URL 如下所示:
&format=json&nojsoncallback=1';
改变它,它应该可以工作。
问候。
【讨论】:
@xmarcos - 好一个!希望@Globalz* 选择了这个作为正确答案,因为我差点错过了。 这应该是答案!拯救了我的一天! 好吧,您仍然需要一些字符串操作来将 JSON(在标题和 cmets 中)中的“\'”字符调整为纯单引号......但是很好的答案。【参考方案2】:这是因为返回的数据不是有效的 JSON。不过,它是有效的 javascript。
返回的数据被包装在名为jsonFlickrApi
的默认回调函数中。
您需要摆脱将 JSON 包装在回调函数中的 JSON 回调,该回调函数应该在客户端执行。您需要对返回的 JSON 进行一些字符串操作,以删除默认回调 jsonFlickrApi
,然后将其传递给 json_decode
$api_key = '####';
$photoset_id = '###';
$query = 'http://api.flickr.com/services/rest/?&method=flickr.photosets.getPhotos&api_key='.$api_key.'&photoset_id='.$photoset_id.'&extras=url_o,url_t&format=json';
$ch = curl_init(); // open curl session
// set curl options
curl_setopt($ch, CURLOPT_URL, $query);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($ch); // execute curl session
curl_close($ch); // close curl session
$data = str_replace( 'jsonFlickrApi(', '', $data );
$data = substr( $data, 0, strlen( $data ) - 1 ); //strip out last paren
$object = json_decode( $data ); // stdClass object
var_dump( $object );
【讨论】:
查看下面的答案以获得更简单的替代方案(请注意其他人,因为我自己几乎错过了它)。【参考方案3】:最好不要在你的 url 中使用 format=json,而是使用 format=php_serial 并获取一个序列化字符串,这样你就不必担心 flickr 的有效格式,并且你会得到一个数组作为回报
$api_key = '####'; $photoset_id = '###'; $query = 'http://api.flickr.com/services/rest/?&method=flickr.photosets.getPhotos&api_key='.$api_key.'&photoset_id='.$photoset_id.'&extras=url_o,url_t&format=php_serial'; $ch = curl_init(); // 打开 curl 会话 // 设置卷曲选项 curl_setopt($ch, CURLOPT_URL, $query); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $data = curl_exec($ch); // 执行 curl 会话 curl_close($ch); // 关闭 curl 会话 $输出=反序列化($数据);【讨论】:
【参考方案4】:堆栈溢出再次拯救了这一天。我浏览了 flickr 文档,发现没有提及这个“nojsoncallback”参数。
谁默认做了这样的功能,然后不告诉任何人如何禁用它?
更糟糕的是,为什么要写你必须启用它才能禁用该功能?!
荒谬...但感谢您的提醒,这解决了我的问题!
【讨论】:
【参考方案5】:nojsoncallback的详情在本页底部https://www.flickr.com/services/api/response.json.html
【讨论】:
以上是关于使用 PHP、curl 解码从 Flickr API 返回的 json 字符串的主要内容,如果未能解决你的问题,请参考以下文章
如何从其他站点检索 json 数据并使用 cURL 对其进行解码?
Webonyx/Graphql-php 入门:如何在 cURL 中获取 API 的响应而不会从 API 实现中获得回声?