2010-07-29 134 views
0

我試圖使用jQuery.getJSON從我沒有自己的域中獲取數據。我已經在過去工作了,但這次它一直在失敗。我在瀏覽器中得到響應,但Chrome說SyntaxError: Unexpected token :和Firefox說invalid label

這有幾個特點。假設代碼是MY_JSON_RESPONSE(不是變量,只是一個「別名」)。這些都返回預期的對象:

a = MY_JSON_RESPONSE; 
eval(MY_JSON_RESPONSE); 

這是請求我做:

$.getJSON("http://xxx.yyy.zzz/abc?callback=?", 
    function(data) { 
    console.log(data); 
    }); 

編輯:下面是匿名響應數據:

{"aaaaaaa":"aaaaaaaa aaaaa aaa aaaaaaaaaa","aaaaa":"aaaaaaaa aaaaa aaa","aa":"0000000","aaaa_aaaaaaa":"aaa aaaaa","aaaaaaa_aaaaaaa":"aa aaa aaaaaaaa aa aaaaaaaa aaa aaaaaaa aaaaaa aaa aaa aaaaaaaa aa aaaaaaaa aa aaaaaa aaaaa aaa aaaaa. aaa aaaaaaaa aaaaa aaa aaaaaaaaaa aaaaaaaa aaaaa aaaaa aaaaaaaa aaaaaaaaaaa aaaaaaaaaa aa aaaa 00 aaaaaaa aaaaaaaaa aa aaa aaaaaaaa aaaaa aaa, aa aaaaaaaaaaa aaaaaaaaaaaaa aaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaa, aaaaaaaaa aaa aaaaaaa aaaaaaaa. 00% aa aaaaaaa aaaaaa aaaaa aaaaa aaaaaaaaaaaaa aaaaa aaaaaaaaaaaaa.","aaaaaaaaa":[{"aaaaaa":"aaaaa aaa aaaaaa aaaaaaaa","aaaaaaa":"aaaaaaaa aa aaaaaa aaa aaaa","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":"\u00a00.00"},{"aaaaaa":"aaa","aaaaaaa":"aaaaaaaa aaaa aa &aaaa;aaaaa aaa aaaaaaaaaa aaaaaaaaa&aaaa; - aaa aaa aa, aaaaa aaa a aaaa aaaaa!","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":"\u00a000.00"},{"aaaaaa":"aaaaa","aaaaaaa":"aaaa aaaa aaaa!!!!","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":"\u00a00.00"},{"aaaaaa":"aaa\/aaa","aaaaaaa":"aaaaaaa aaaaa aaaa aaa aaaa aaaaa aaa aaaaa aaa aaaaaaa aaaa!","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":""},{"aaaaaa":"aaaaaaaaa","aaaaaaa":"","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":""},{"aaaaaa":"aa (aaaaaaa &aaa; aaaaaaaaa)","aaaaaaa":"","aaaa":"00\/00\/00","aaaaaa":"\u00a0000.00","aaaa_aaa":""},{"aaaaaa":"aaaaa aaaaaaaa","aaaaaaa":"","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":"\u00a00.00"},{"aaaaaa":"aaaaaa aaaaaa","aaaaaaa":"","aaaa":"00\/00\/00","aaaaaa":"","aaaa_aaa":""},{"aaaaaa":"aaaaaa aaaaaaaa","aaaaaaa":"aaaa aaaaaaa aaaaaaaaa","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":""},{"aaaaaa":"aaaaaa aaaaaaaaaaa","aaaaaaa":"aaaaa aaaaaa�a aaa, aaa! aaaa aaaaaaaa aa aaa aaa! :-) --aaa","aaaa":"00\/00\/00","aaaaaa":"","aaaa_aaa":""},{"aaaaaa":"aaaaaa aaaa - aaaaaaaa aaaaaa aaa","aaaaaaa":"aaaaaa aa aaa aaa aaaaaaaa aaaaa aaaaaa aa aaaa aa aaa aaaaa aaa aaaaa. aaaa aaaa aaaaaa aaaaaaaaa !!","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":""},{"aaaaaa":"aaa aaaaaaaaa","aaaaaaa":"aa aaaaaa aaaa aaaaaaaa aa aaaa aa aaaa aa a aaaa aaaaa aaa aaaaaaaaaa. aaaa aa aa aaaaaa aa a aaaa aaaaa.","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":""},{"aaaaaa":"aaaaaaaaa aaa aaaaaaaaaaa aaaaaaa aaaaaa","aaaaaaa":"aaaaa aaaaa. aaaa aa aaa aaaaaa aaaaaaaaa!!","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":""},{"aaaaaa":"aaaaa aaaaa","aaaaaaa":"","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":"\u00a00.00"},{"aaaaaa":"aaaaaaaaa aaaaaa","aaaaaaa":"aaaaaaa aaa aaaa aaaaaa�a aaaaaaaaa aaaa","aaaa":"00\/00\/00","aaaaaa":"\u00a0000.00","aaaa_aaa":"\u00a000.00"},{"aaaaaa":"aaaaaaa aaaaaa","aaaaaaa":"aaaaaaaaa aaaaa, aaa! aaaaaaa &aaa; aaaaa","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":"\u00a00.00"},{"aaaaaa":"aaaaa aaaaaaaa","aaaaaaa":"aaaaaaaa aaaaaaa - aaaaaaa aaaaaaaaa a aaa aaa aaaaaa!","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":""},{"aaaaaa":"aaaaa aaaaaa","aaaaaaa":"aaaaaaaaaaaa - aaa!","aaaa":"00\/00\/00","aaaaaa":"\u00a0000.00","aaaa_aaa":""},{"aaaaaa":"aaaaa aaaaaaaaaaa","aaaaaaa":"aaaa aaaa!!!","aaaa":"00\/00\/00","aaaaaa":"\u00a00.00","aaaa_aaa":""},{"aaaaaa":"aaaaa aaaaaaa","aaaaaaa":"aaaa aaaa aaaaa, aaaaaaa, aaaaaaa, aaaaa, aaa, aaaa, aaa, aaaaaaaa, aaaa, aaa, aaaaa, aaa, aaa, aaaaa, aaa, aaaa, aaaa, aaaa, aaaaa, aaa, aaaaaaaa","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":""},{"aaaaaa":"aaaaaaaa aaa","aaaaaaa":"","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":""},{"aaaaaa":"aaaaa aaaaaa","aaaaaaa":"aaaa aaa aa aa aaaa aa a aaaaaaa aa aaaaa! aaa aaa aaaaa!","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":""},{"aaaaaa":"aaaaaaa aaaaaaa","aaaaaaa":"","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":""},{"aaaaaa":"aaaaaa aaaaaaaa","aaaaaaa":"aa aa aa! :)","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":""},{"aaaaaa":"aaaaaa aaaaaaaaa","aaaaaaa":"aaaa a aaaaaa aaaaaaaaa aaaa aa aa aaa :)","aaaa":"00\/00\/00","aaaaaa":"","aaaa_aaa":""},{"aaaaaa":"aaa-aaaaaaa aaaaaaaa","aaaaaaa":"aaaa aaaaaaaa aa aa aaa aaaa aa aa aaaaaaaaaaa, aaaa a. aaaaaaaa","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":""},{"aaaaaa":"aaaaaaa aaaa","aaaaaaa":"","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":""},{"aaaaaa":"aaaaaaa aaaa","aaaaaaa":"a aaaaaaaa aa aaa aaaaaaaa aaaaa aaa aa aaaaa aa aaaaa aaa aaaaa aaaaa aa aaa aaaaaa aa aaaaaaaaa.","aaaa":"00\/00\/00","aaaaaa":"","aaaa_aaa":""},{"aaaaaa":"aaaaaaa aaaaaaa","aaaaaaa":"aaaaa aaaaaaaa aaa aaaa aaaaaaa aaaa aaaaaa aaa!","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":""},{"aaaaaa":"aaa aaaa","aaaaaaa":"aaaa aaaa aaaa aaaa aaaaaaaaaaa aaaa aaa aaa aaaaaaaaa aaaa aaa aa","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":"\u00a00.00"}],"aaaa_aaaaaaa":"","aaaa_aaa":"\u00a0000.00","aaaaaaaaa_aaaaaa":"\u00a00,000.00","aaaaaaaaa_aaaaa":"\u00a00,000.00","aaaaaaa_aaaa":"aaaa:\/\/aaa.aaaaaaaaaa.aaa\/\/aaaaa\/aaaaaaa.aaaa?aaaa=aaaaaaa&aaaaaaaaa=aaaaaaaaaaa&aaaaa=000&aaaaaa=000&aaa=aaaa_aaaa0.aaa","aaaaaaaaa_aaaaaa":"\u00a00,000.00","aaaaaaaaa_aaaaaaa":"\u00a00.00","aaa_aaaaaa":true,"aaaaaaaaaa_aaaaaaaa":00} 

我想避免必須在我自己的域上的服務器上執行此操作,以儘量減少服務器負載。

+1

檢查結果JSON格式是否有效。 – 2010-07-29 19:27:24

+2

請發佈淨化版本,如果沒有它,我們無法確定返回的錯誤。 – Lazarus 2010-07-29 19:27:31

回答

1

jQuery 1.4中的JSON解析比以前的版本更嚴格。根據您的瀏覽器,它可能會使用本機JSON解析,這與eval不同。一個很大的區別是,現在,所有密鑰必須用雙引號引起來,而不是單引號。 eval會像你說的那樣沒有錯誤地執行它,因爲JS根本不會嚴格引用屬性名稱,但它會失敗JSON解析。

我在將項目轉換爲jq 1.4時遇到了一個問題,因爲我有一些手動構建json字符串的舊代碼。例如

return "{'a':12}"; // fails parsing due to single quotes 

最好就是使用內置JSON庫:

return '{"a":12}'; // works 
return json_encode(array('a'=>12)); // preferred! 
return json.dumps({'a':12}) # etc. 

,因爲他們總能產生有效的JSON。

+0

我認爲你是對的,響應數據中有一些未轉義的值。問題是我沒有擁有我請求數據的域名,那麼在它調用內置的eval函數之前,有沒有辦法攔截jQuery的JSONP處理? – 2010-07-30 08:58:30

+0

您可以將數據作爲字符串獲取,然後調用eval或json.parse。 – JAL 2010-07-30 14:12:14

+0

謝謝,問題似乎是jQuery處理JSONP的方式。我不知道內部結構,但它似乎將其作爲一個腳本來獲取,然後在將控制權交給jQuery之前,瀏覽器設法找到一些語法問題並拋出錯誤。 beforeSend()或dataFilter()都不被觸發。我想我只需要在我自己的服務器上進行處理。 – 2010-08-02 09:23:31

0

JSON示例無效。它包括這個子字符串:

}, { 

也就是說,它結束一個對象並啓動另一個對象。所以它似乎是一個對象數組,除非沒有括住方括號。

編輯:我的錯!它確實有一個嵌套的數組。也許你應該在產生它時「很好地打印」它,以便更容易地看出問題的所在。

0

有趣的是,根據http://jsonformatter.curiousconcept.com/表示JSON有效。

正如其他人指出... jQuery的1.4不接受畸形的JSON,更早版本,將不過(如果你想要去的方向爲一些瘋狂的原因。)

你是如何調用實際JSON數據元素碼?我遇到了幾次問題......完全有效的JSON,但在jQuery中不是很容易調用。

一個例子:tumblr(博客引擎)的API ......由於某些原因,他們使用...「 - 」...所以對於博客文章的「身體」,他們有「正規體」.. 。jQuery對這種激情十分討厭。

你會認爲你可以做...

json.posts[2].regular-body 

但是,這會報錯,所以你需要[] ...

json.posts[2]['regular-body'] 

所以......

如果你能更詳細地提供有關你如何調用JSON數據elements推薦給您的好心人?

+0

我無法查詢JSON數據中的單個元素,因爲腳本在getJSON函數中因錯誤而死亡。 – 2010-07-30 11:15:29

0

我現在也經歷同樣的問題,我的服務器響應正確的json數據。我遵循你使用過的相同的代碼模式。我在這裏評論之前做過R & D,以解決這個錯誤。正如我們使用「callback =?」在url中,它傾向於請求對象爲JSONP。它假定響應以JSONP格式提供,但響應以純JSON格式顯示。一旦得到響應,它會嘗試根據JSONP進行解析,而不是像JSON。如果我錯了,請告訴我,如果問題得到解決,請告訴我。謝謝。