2013-11-28 65 views
0

我想解析JSON文件中的一些數據。在這裏可以看到有問題的JSON文件:http://api.bandsintown.com/artists/weezer/events.jsongetJson返回數組的問題

我使用jQuery檢索帶有$.getJSON函數的JSON文件,但是當我嘗試追加數據或嘗試在警告框中顯示它時,沒有任何反應。

代碼:

$.getJSON("api.bandsintown.com/artists/weezer/events.json", function(result) { 

    $.each(result, function(key, val) { 
     alert(key + val); 
    }); 

}); 

我已經使用了多種方法,但我似乎無法找出問題所在。

+2

您是否嘗試過' 「http://api.bandsintown.com/artists/weezer/events.json」'呢? –

+0

瀏覽器控制檯中的任何錯誤? – Curt

+0

是的我沒有運氣嘗試與http前面的網址。我的瀏覽器控制檯中沒有出現錯誤。我還有其他幾個getJson函數,我從Freebase,Facebook和Youtube中抽取了一些東西,沒有任何問題。 –

回答

2

看起來你正在做AJAX跨域請求。所以它不起作用。

嘗試JSONP:

$.getJSON("http://api.bandsintown.com/artists/weezer/events.json?callback=? 
&app_id=ramesh", function(result) { 

    $.each(result, function(key, val) { 
     alert(key + val); 
    }); 

});

工作小提琴:http://jsfiddle.net/WtaPu/1/

APP_ID發送指http://www.bandsintown.com/api/authentication

+0

Thx taht做到了。所以通過添加回調你使用jsonp?我仍然有點困惑。我寧願瞭解機制,而不是複製其他人的代碼。 –

+0

「如果URL包含字符串」callback =?「(或類似的,由服務器端API定義),則請求將被視爲JSONP。」 - 來自http://api.jquery.com/jQuery.getJSON/ – Ramesh

+0

@KarstenTietje:https://en.wikipedia.org/wiki/JSONP。 –

0

使用捲曲

$to=curl_init('http://api.bandsintown.com/artists/weezer/events.json'); 

curl_setopt($to, CURLOPT_POST, true); 
curl_setopt($to, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($to, CURLOPT_POSTFIELDS, $post); 
curl_setopt($to, CURLOPT_SSL_VERIFYPEER, false); 
$result = curl_exec($to);// final result 
+0

實際的問題是OP無法向URL發出Ajax請求。 –

+0

仍然不會返回任何內容。 –

+0

我現在使用應用程序ID和API中的api版本,但仍然不會返回任何內容。 –

0

嘗試我的控制檯上,我得到如下:

[Error] XMLHttpRequest cannot load http://api.bandsintown.com/artists/weezer/events.json. Origin http://localhost is not allowed by Access-Control-Allow-Origin. 

這個「問題」叫做十字架-Origin資源共享(又名。 CORS):

本文檔定義了一種機制,以使客戶端跨來源請求。使API能夠對資源進行跨源請求的規範可以使用本規範定義的算法。如果在example.org資源上使用這樣的API,則hello-world.example.org上的資源可以選擇使用本規範描述的機制(例如,指定Access-Control-Allow-Origin:example.org作爲響應頭),這將允許從example.org跨源訪問該資源。

這是一種安全機制,默認情況下,瀏覽器和服務器在跨站點檢索數據時適用。的CORSW3C推薦說,服務器必須實現的頭訪問控制允許來源,無論是指定服務器所允許,還是讓大家來從它的數據(使用通配符*):

用戶代理通常對網絡請求應用同源限制。這些限制可防止從一個來源運行的客戶端Web應用程序獲取從另一個來源檢索到的數據,還會限制不安全的HTTP請求,這些請求可以自動啓動到與正在運行的應用程序的來源不同的目標。

但是,這隻適用於用戶代理(主要是瀏覽器)。因此,試圖通過Ruby來獲取數據,例如,因此得到它:

require 'open-uri' 
open("http://api.bandsintown.com/artists/weezer/events.json"){|f| f.read()} 

這將返回一個包含JSON字符串。

關於JSONP:您將無法使用它,以及 - 服務器必須返回一個回調函數裏面的JSON數據:

my_callback([{"valid_json":"no!"},{"valid_javascript":"yes!"}]) 

這將是完成(如果支持的話)通過腳本標籤:

<script type="text/javascript" src="http://api.bandsintown.com/artists/weezer/events.json?jsonp=my_callback"></script> 

來源:W3C

+0

我想說這個問題叫做*同源策略*,一個解決方案叫做* CORS *。 –

+0

該政策是CORS的一部分,它指出了跨域請求可能存在的問題,其背後的歷史不可能,現在它包含允許這樣做的規範。如果該政策不是CORS的一部分,我們將無法將文件從CDN中鏈接出來。聽起來像XHR的常識:它主要與異步調用(AJAX)有關,但它也可以用來做出底層的同步請求(如worker/load/unload)。 – wwmoraes