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

问题描述:

我试图解码从我的PHP代码中的flickr返回的json字符串。即时使用CURL,但它仍然返回一个字符串,即使当我绕json sring变量包装json_decode()。有任何想法吗?使用PHP解析从Flickr API返回的json字符串,curl

$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)); 
+0

什么是响应看起来像? – sberry 2010-05-02 04:27:22

这是因为返回的数据不是有效的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

查看下面的答案更简单的选择(注意别人,因为我几乎错过了它自己)。 – 2012-04-06 22:26:42

您要求的网址结尾:

&format=json&jsoncallback=1'; 

参数的正确名称是nojsoncallback,所以正确的网址,你应该使用结束这样的:

&format=json&nojsoncallback=1'; 

改变它,它应该工作。

问候。

+1

谢谢澄清对我来说雅各布和xmarcos!使完美的感觉... – Globalz 2010-05-09 13:14:21

+3

* @ xmarcos * - 好一个! Wish @ Globalz *已经选择了这个作为正确答案,因为我几乎错过了它。 – MikeSchinkel 2010-10-13 18:41:52

+1

谢谢xmarcos,它完全解决了我遇到的问题。 – 2011-10-25 22:31:28

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

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

更糟糕的是,为什么会写入您必须使其能够禁用才能禁用该功能?

可笑......但谢谢你的抬头,这解决了我的问题!

更妙的是,而不是使用您的网址,使用格式= php_serial格式= JSON,并得到一个序列化的字符串,那么你不会担心来自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); 

nojsoncallback的详细资料位于本页底部https://www.flickr.com/services/api/response.json.html