Декодируйте строку json, возвращенную из API Flickr, с помощью PHP, curl


Я пытаюсь декодировать строку json, возвращенную из flickr, в моем PHP-коде. Я использую CURL, но он продолжает возвращать строку, даже когда я обертываю json_decode() вокруг переменной sring json. Есть идеи?

$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));
Author: Programmer Bruce, 2010-05-02

5 answers

Это связано с тем, что возвращаемые данные не являются допустимыми 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 );
 17
Author: Jacob Relkin, 2010-05-02 04:51:26

URL-адрес вашего запроса заканчивается:

&format=json&jsoncallback=1';

Правильное имя параметра nojsoncallback, поэтому правильный URL-адрес, который вы должны использовать, заканчивается следующим образом:

&format=json&nojsoncallback=1';

Измените это, и это должно сработать.

С уважением.

 47
Author: xmarcos, 2010-05-09 00:26:58

Еще лучше вместо использования format=json в вашем URL-адресе, используйте 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);
 2
Author: Mospired, 2010-07-16 15:59:03

Переполнение стека снова спасает ситуацию. Я просмотрел документацию flickr и не нашел УПОМИНАНИЯ об этом параметре "nojsoncallback".

Кто делает такую функцию по умолчанию, а затем никому не говорит, как ее отключить?

Еще хуже, почему должно быть написано, что вы должны включить его, чтобы отключить функцию?!

Смешно... но спасибо за предупреждение, это решило мою проблему!

 0
Author: SelAromDotNet, 2010-06-02 15:47:11

Подробная информация о nojsoncallback находится внизу этой страницы https://www.flickr.com/services/api/response.json.html

 0
Author: mnm, 2014-10-11 14:42:17