2010-05-02 41 views
14

Tôi đang cố gắng giải mã một chuỗi json được trả về từ flickr trong mã PHP của tôi. Im sử dụng CURL nhưng nó vẫn trả về một chuỗi ngay cả khi tôi quấn json_decode() xung quanh biến sring json. Bất kỳ ý tưởng?Giải mã chuỗi json được trả lại từ API Flickr bằng cách sử dụng 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âu trả lời giống như thế nào? – sberry

Trả lời

17

Đó là vì dữ liệu trả về không phải là JSON hợp lệ. JavaScript hợp lệ của nó, mặc dù. Dữ liệu trả về được bao bọc bên trong hàm gọi lại mặc định được gọi là jsonFlickrApi.

Bạn cần thoát khỏi hàm gọi lại JSON, bao bọc JSON bên trong chức năng gọi lại mà sau đó được cho là được thực hiện ở phía máy khách. Bạn cần phải làm một số thao tác chuỗi trên JSON trở lại để loại bỏ các callback mặc định jsonFlickrApi và sau đó vượt qua nó để 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

Xem câu trả lời dưới đây để biết cách thay thế đơn giản hơn (lưu ý những người khác vì tôi gần như đã bỏ lỡ nó). –

47

URL yêu cầu của bạn kết thúc với:

&format=json&jsoncallback=1'; 

Tên đúng của tham số là nojsoncallback, vì vậy URL đúng bạn nên sử dụng đầu như thế này:

&format=json&nojsoncallback=1'; 

Thay đổi điều đó và nó sẽ hoạt động.

Trân trọng.

+1

Cảm ơn bạn đã làm rõ điều đó đối với tôi Jacob và xmarcos! Làm cho cảm giác hoàn hảo ... – Globalz

+3

* @ xmarcos * - Tốt nhất! Chúc @ Globalz * đã chọn câu trả lời này là đúng vì tôi gần như đã bỏ lỡ nó. – MikeSchinkel

+1

cảm ơn, xmarcos, đã hoàn toàn khắc phục sự cố tôi gặp phải. –

0

tràn ngăn xếp sẽ lưu lại ngày. Tôi đã quét sạch tài liệu flickr và tìm thấy NO MENTION của paramater "nojsoncallback" này.

người tạo một tính năng như vậy theo mặc định, sau đó không cho bất kỳ ai biết cách tắt tính năng này?

thậm chí tệ hơn, tại sao nó được viết rằng bạn phải ENable nó để DISable chức năng ?!

vô lý ... nhưng cảm ơn những người đứng đầu, điều này đã khắc phục được sự cố của tôi!

2

Thậm chí tốt hơn thay vì sử dụng một format = json trong url của bạn, định dạng sử dụng = php_serial và nhận được một chuỗi serialize sau đó bạn sẽ không phải lo lắng về các định dạng hợp lệ từ flickr và bạn nhận được một mảng lại

 
$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); 
Các vấn đề liên quan