2010-05-02 19 views
14

Im intentando decodificar una cadena json devuelta desde flickr dentro de mi código PHP. Estoy usando CURL pero sigue devolviendo una cadena incluso cuando envuelvo json_decode() alrededor de la variable json sring. ¿Algunas ideas?cadena decod json devuelta desde Flickr API usando 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

¿Cómo se ve la respuesta? – sberry

Respuesta

17

Eso es porque los datos devueltos no es válida JSON. Su JavaScript válido, sin embargo. Los datos devueltos se envuelven dentro de una función de devolución de llamada predeterminada llamada jsonFlickrApi.

Debe deshacerse de la devolución de llamada JSON que envuelve el JSON dentro de una función de devolución de llamada que luego se supone que se ejecutará en el lado del cliente. Es necesario hacer un poco de manipulación de cadenas en el JSON devuelto para eliminar la devolución de llamada por defecto jsonFlickrApi y luego pasarlo a 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

Consulte la respuesta a continuación para una alternativa más simple (tenga en cuenta a los demás ya que casi me lo perdí). –

47

Su solicitud de URL termina con:

&format=json&jsoncallback=1'; 

El nombre correcto del parámetro es nojsoncallback, por lo que la URL correcta que debe utilizar extremos de esta manera:

&format=json&nojsoncallback=1'; 

Cambia eso y debería funcionar.

Atentamente.

+1

Gracias por aclarar eso para mí Jacob y xmarcos! Tiene perfecto sentido ... – Globalz

+3

* @ xmarcos * - ¡Bien! Wish @ Globalz * había elegido esta como la respuesta correcta porque casi me la perdí. – MikeSchinkel

+1

gracias, xmarcos, eso solucionó totalmente el problema que estaba teniendo. –

0

desbordamiento de pila salva el día otra vez. Revisé la documentación de flickr y no encontré ninguna mención de este modelo "no jsoncallback".

quién hace una función de este tipo por defecto, y luego no le dice a nadie cómo deshabilitarla?

aún peor, ¿por qué debería escribirse que tiene que ENhabilitarlo para DESACTIVAR la función?

ridículo ... pero gracias por el aviso, ¡esto solucionó mi problema!

2

Incluso mejor en lugar de utilizar un formato = JSON en su URL, el formato de uso = php_serial y obtener una cadena serializar, entonces no tiene que preocuparse de formateo válida desde el flickr y se obtiene una matriz a cambio

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