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

Im пытается декодировать строку json, возвращенную из flickr в моем PHP-коде. Я использую 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

Это потому, что возвращаемые данные недействительны 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

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

&format=json&jsoncallback=1';

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

&format=json&nojsoncallback=1';

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

С уважением.

Ответ 3

Даже лучше, чем использовать формат = json в вашем URL-адресе, используйте формат = php_serial и получите строку serialize, тогда вам не придется беспокоиться о действительном формировании из 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);

Ответ 4

переполнение стека сохраняет день снова. Я просмотрел документацию flickr и нашел NO MENTION этого параметра nojsoncallback.

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

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

смешно... но спасибо за головы, это исправило мою проблему!