2010-05-02 9 views
14

Im essayant de décoder une chaîne json retournée à partir de flickr dans mon code PHP. Im using CURL mais il continue à renvoyer une chaîne même quand j'enveloppe json_decode() autour de la variable json sring. Des idées?Decode json chaîne retournée à partir de l'API Flickr en utilisant PHP, 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

À quoi ressemble la réponse? – sberry

Répondre

17

C'est parce que les données renvoyées ne sont pas JSON valide. Son JavaScript valide, cependant. Les données renvoyées sont enveloppées dans une fonction de rappel par défaut appelée jsonFlickrApi.

Vous devez vous débarrasser du rappel JSON qui enveloppe le JSON dans une fonction de rappel qui est supposée être exécutée côté client. Vous devez faire une manipulation de chaînes sur le JSON retourné pour supprimer le rappel par défaut jsonFlickrApi et passer ensuite à 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

Voir la réponse ci-dessous pour une alternative plus simple (notez aux autres que j'ai presque raté moi-même). –

47

URL de votre demande se termine par:

&format=json&jsoncallback=1'; 

Le nom correct du paramètre est nojsoncallback, de sorte que le droit URL que vous devez utiliser extrémités comme ceci:

&format=json&nojsoncallback=1'; 

Changez cela et cela devrait fonctionner.

Cordialement.

+1

Merci d'avoir clarifié cela pour moi Jacob et xmarcos! Fait parfaitement sens ... – Globalz

+3

* @ xmarcos * - Un bon! Wish @ Globalz * avait choisi cette réponse comme bonne, car je l'avais presque manquée. – MikeSchinkel

+1

merci, xmarcos, qui a totalement résolu le problème que j'avais. –

0

Le débordement de pile permet d'économiser de nouveau le jour. J'ai parcouru la documentation de Flickr et n'ai trouvé aucune mention de ce paramètre "nojsoncallback".

qui fait une telle fonctionnalité par défaut, puis ne dit à personne comment le désactiver?

pire encore, pourquoi serait-il écrit que vous devez l'activer pour désactiver la fonction ?!

ridicule ... mais merci pour les heads up, cela a résolu mon problème!

2

Mieux encore au lieu d'utiliser un format = json dans votre URL, utilisez le format = php_serial et obtenir une chaîne de serialize alors vous avez pas à vous soucier formating valide de flickr et vous obtenez un tableau en retour

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