2012-04-27 70 views
1

我從一箇中間人文件Flickr的API獲取數據(以避免跨域問題):字符串轉換爲JSON使用jQuery

<?php 

header('Cache-Control: no-cache, must-revalidate'); 
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); 
header('Content-type: application/json'); 

die(json_encode(file_get_contents($_REQUEST['url']))); 
?> 

這個文件是獲取由JavaScript:

//Flickr 
var myurl = encodeURIComponent('http://api.flickr.com/services/rest/?method=flickr.photosets.getPhotos&api_key=1408bff5f72a4b84b924d13e8562b6a2&[email protected]&photoset_id=72157629903184261&format=json'); 
    $.getJSON("middle.php?url=" + myurl, function(data){ 
     console.log(typeof data); 
    }); 

但是console.log顯示結果是「字符串」而不是JSON對象。香港專業教育學院試圖把它與轉換爲一個JSON對象:

jQuery.parseJSON(data) 

但控制檯給了我這個錯誤:

Uncaught SyntaxError: Unexpected token j 

這是字符串:

jsonFlickrApi({"photoset":{"id":"72157629903184261", "primary":"7115173307", "owner":"[email protected]", "ownername":"wedocommunication", "photo":[{"id":"7115173331", "secret":"24900ff306", "server":"5447", "farm":6, "title":"Lounge", "isprimary":"0"}, {"id":"7115173307", "secret":"3435f9a983", "server":"7256", "farm":8, "title":"Hofansicht", "isprimary":"1"}, {"id":"7115173379", "secret":"7747e50597", "server":"7278", "farm":8, "title":"Konfi", "isprimary":"0"}, {"id":"6969093048", "secret":"d4389bc0e4", "server":"7055", "farm":8, "title":"Lounge", "isprimary":"0"}, {"id":"6969093086", "secret":"8e7263005b", "server":"5152", "farm":6, "title":"Eingangsbereich", "isprimary":"0"}], "page":1, "per_page":500, "perpage":500, "pages":1, "total":"5"}, "stat":"ok"}) 

我能怎麼做將字符串轉換爲對象?

回答

0

有人張貼我一直在尋找的答案,但出於某種原因,他們刪除了帖子,所以我在這裏把它複製:

$.ajax({ 
    url: 'http://api.flickr.com/services/rest/?method=flickr.photosets.getPhotos&api_key=1408bff5f72a4b84b924d13e8562b6a2&[email protected]&photoset_id=72157629903184261&format=json', 
    type: 'GET', 
    dataType: 'jsonp', 
    jsonpCallback: 'jsonFlickrApi', 
    success: function(data){ 
     console.log(data); 
    } 
}); 

這完全沒有工作。謝謝,不管它是誰:)

也許其他的工作,但這是我覺得更舒適的人。謝謝你們。

5

Flickr是返回響應爲JSONP,這是JavaScript的不是JSON,你應該使用jQuery的JSONP類型請求,請參閱: - http://api.jquery.com/jQuery.ajax/

其實該頁面提供了API -

對Flickr的一個例子
$.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?jsoncallback=?", 
    { 
    tags: "cat", 
    tagmode: "any", 
    format: "json" 
    }, 
    function(data) { 
    $.each(data.items, function(i,item){ 
     $("<img/>").attr("src", item.media.m).appendTo("#images"); 
     if (i == 3) return false; 
    }); 
    }); 
+1

作爲@ocanal在他的回答中提到,你不需要這個代理 – chrismarx 2012-04-27 14:38:04

+0

這也不是工作:http://pastebin.com/ZEKWTSCc我得不到輸出 – 2012-04-27 14:45:40

+0

它的工作原理是這樣的 - http:///pastebin.com/n7WCJrGZ,看看爲什麼urs可以工作 – chrismarx 2012-04-27 15:01:30

0

JSON以對象大括號開頭{jsonFlickrApi(不是JSON對象的一部分。 如果你只需要內部,你可以先將replacedata先移除jsonFlickrApi(部分,但似乎Flickr會有更好的內置解決方案。

0

您將不得不在最後刪除「jsonFlickrApi(」開頭和「)」,因此'json字符串'只能讀取{"photoset":{"id":"72157629903184261", "primary":"7115173307", "owner":"[email protected]", "ownername":"wedocommunication", "photo":[{"id":"7115173331", "secret":"24900ff306", "server":"5447", "farm":6, "title":"Lounge", "isprimary":"0"}, {"id":"7115173307", "secret":"3435f9a983", "server":"7256", "farm":8, "title":"Hofansicht", "isprimary":"1"}, {"id":"7115173379", "secret":"7747e50597", "server":"7278", "farm":8, "title":"Konfi", "isprimary":"0"}, {"id":"6969093048", "secret":"d4389bc0e4", "server":"7055", "farm":8, "title":"Lounge", "isprimary":"0"}, {"id":"6969093086", "secret":"8e7263005b", "server":"5152", "farm":6, "title":"Eingangsbereich", "isprimary":"0"}], "page":1, "per_page":500, "perpage":500, "pages":1, "total":"5"}, "stat":"ok"}

然後這可以由JS解析爲常規JSON數據。

+0

它返回那個包裝的原因,這是一個JSONp響應。 – freshnode 2012-04-27 15:10:15

2

您不需要使用代理來避免跨域問題,只需使用JSONP request即可。

$.getJSON("http://api.flickr.com/services/rest/?method=flickr.photosets.getPhotos&api_key=1408bff5f72a4b84b924d13e8562b6a2&[email protected]&photoset_id=72157629903184261&format=json&jsoncallback=?",function(data){ 
     console.log(data); 
    });​ 

DEMO

0

正如上面已經提到的那樣,Flickr發送的JSON響應包裝在jsonFlickrApi回調方法中。

要返回純粹的JSON數據,您可以使用nojsoncallback=1請求參數。

E.g.http://api.flickr.com/services/rest/?method=flickr.photos.getSizes&api_key=_secret_app_key&photo_id=8321754843&format=json&nojsoncallback=1