15

我试图在我的 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));
4

5 回答 5

48

您的请求 URL 以:

&format=json&jsoncallback=1';

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

&format=json&nojsoncallback=1';

改变它,它应该工作。

问候。

于 2010-05-09T00:26:58.287 回答
18

那是因为返回的数据不是有效的 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 );
于 2010-05-02T04:27:52.027 回答
2

更好的是,而不是在您的 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 会话

$输出=反序列化($数据);
于 2010-07-16T15:59:03.900 回答
0

nojsoncallback的详细信息在本页底部https://www.flickr.com/services/api/response.json.html

于 2014-10-11T14:42:17.847 回答
0

堆栈溢出再次拯救了这一天。我浏览了 flickr 文档,发现没有提及这个“nojsoncallback”参数。

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

更糟糕的是,为什么要写你必须启用它才能禁用该功能?!

荒谬...但是感谢您的提醒,这解决了我的问题!

于 2010-06-02T15:47:11.700 回答