使用 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 字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何在php中解码从curl产生的json文件

Flickr图片拉入PHP JSON

用 php 提取 Instagram 信息——解码然后呢?

如何使用 cURL 获取 JSON 数据并解码数据?

如何从其他站点检索 json 数据并使用 cURL 对其进行解码?

Webonyx/Graphql-php 入门:如何在 cURL 中获取 API 的响应而不会从 API 实现中获得回声?