解码使用PHP,curl从Flickr API返回的json字符串

时间:2010-05-02 04:23:14

标签: php curl flickr json

我试图在我的PHP代码中解码从flickr返回的json字符串。我使用CURL但它仍然返回一个字符串,即使我在json sring变量周围包装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&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));

5 个答案:

答案 0 :(得分:47)

您的请求网址以:

结尾
&format=json&jsoncallback=1';

参数的正确名称是 nojsoncallback ,因此您应该使用的正确URL如下所示:

&format=json&nojsoncallback=1';

改变它,它应该有用。

问候。

答案 1 :(得分:17)

那是因为返回的数据无效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 );

答案 2 :(得分:2)

更好的是,不要在你的网址中使用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(); // 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

$output = unserialize ($data);

答案 3 :(得分:0)

堆栈溢出再次节省了一天。我搜索了flickr文档,发现没有注意到这个“nojsoncallback”参数。

谁默认制作这样的功能,然后不告诉任何人如何禁用它?

更糟糕的是,为什么要编写你必须ENable才能使功能失效?!

荒谬......但是感谢抬头,这解决了我的问题!

答案 4 :(得分:0)

nojsoncallback 的详细信息位于此页面的底部https://www.flickr.com/services/api/response.json.html