2011-07-20 75 views
0

我有一個AJAX調用收到此JSON字符串:解析使用Javascript

{status:OK,addresses:[0,1,2,3,4,5]} 

要將其轉換成JSON對象我有這樣一行:

var jsonObj = eval(jsonString); 

但會拋出異常!這個在異常變量中沒有消息。 我也使用

{"status":"OK","addresses":[0,1,2,3,4,5]} 

嘗試和,再次,拋出一個異常,但說了意外字符「&」被發現。

我正在使用Struts2,並且從行動中收到JSon。

任何幫助將不勝感激。 謝謝

+2

這不是一個JSON字符串,它甚至不是有效的JavaScript對象字面值。 n是JSON,我期望'eval'來處理它(但應避免使用'eval',去獲取json2.js)。由於數據中沒有'&',因此它必須來自您沒有提供的代碼。由於我們看不到,我們無法告訴您如何解決這個問題。 – Quentin

+0

所以我確認當JSon從請求收到時,所有的「被替換爲" ......這可能是問題嗎? –

+0

是的!解析器期望JSON不是HTML編碼的JSON! – Quentin

回答

3
{status:OK,addresses:[0,1,2,3,4,5]} 

不是有效的JSON,因爲引號statusaddresses丟失,並且是因爲報價沒有有效的JSON也沒有有效的JavaScript大約在OK缺失。

此外,請勿使用eval來解析JSON - 它允許攻擊者在頁面上下文中執行任意JavaScript。相反,請使用安全替代品JSON.parse(內置於現代瀏覽器和其他EcmaScript 5實現)或JSON2

+0

@ Stargazer712你能提供一個源代碼嗎?http://json.org的官方語法非常清楚引用Python的,Chromium的解析器和[trivialjson](https://github.com/phihag/trivialjson)(我的解析器;))拒絕了'{a:1}'。 – phihag

0

這是爲我工作:

JSON.parse('{ "status" : "OK", "addresses" : [0,1,2,3,4,5]}'); 
0

如果你想使用eval,那麼您需要使用您發佈的例子({"status":"OK","addresses":[0,1,2,3,4,5]}),你需要用括號包圍的字符串,例如:

var jsonObj = eval('('+jsonString+')'); 

這使得jsonString有效javascript語句。

說到這裏,我鼓勵你使用JSON.parse,正如其他人發佈的一樣。它更安全。

+1

parens似乎並不對我來說是必需的。見http://jsfiddle.net/jfriend00/FcSKR/。 – jfriend00

+0

@ jfriend00,那是因爲你沒有*定義一個JSON字符串,而是你定義了一個字面的JavaScript對象。 http://jsfiddle.net/FcSKR/2/ – riwalk

+0

是的,我的錯誤 - 對不起。 – jfriend00

1

請勿使用eval:請使用適當的JSON解析器,如JSON2

您可能在響應中有額外的內容:請檢查您是否打印了其他任何內容。

0

兩個問題解決:

  1. 添加引號的「OK」,使之成爲法律JavaScript字符串。
  2. 字符串周圍添加括號發送給eval這樣eval("(" + jsonString + ")")';

之前,此:

{status:OK,addresses:[0,1,2,3,4,5]} 

就必須改變這一點:

{status:"OK",addresses:[0,1,2,3,4,5]} 

是有效的JavaScript(注意「OK」左邊的引號)。

它應該是這是有效的JSON(周圍的按鍵報價太):

{"status":"OK", "addresses":[0,1,2,3,4,5]} 

確定全部由自己也不是沒有它周圍的報價已知一段JavaScript代碼,使之成爲一個JavaScript字符串。在未來,你可以測試自己在一個小的測試牀,看到的錯誤是在你最喜歡的JavaScript調試器是什麼:

http://jsfiddle.net/jfriend00/FcSKR/

var jsonString = '{"status":"OK","addresses":[0,1,2,3,4,5]}'; 
var jsonObj = eval("(" + jsonString + ")"); 
alert("success"); 

如果仍然得到一個錯誤與{"status":"OK","addresses":[0,1,2,3,4,5]}和括號的加入在發送到eval之前,那麼您的數據不是您認爲的數據,您需要進行一些調試以確切瞭解響應中的內容(查看調試器中的值,將值放入警報等。 )。響應中可能還有其他一些東西,你不知道會在那裏。

注意:在某些情況下,像JSON.parse()這樣的JSON解析器和合法的JSON字符串比使用Javascript的eval()更安全,可以是任何東西。

+0

這不是一個JSON字符串,而是一個字面JavaScript對象。括號是必需的。 http://jsfiddle.net/FcSKR/2/ – riwalk

+0

好吧,我在它周圍添加了parens,儘管我的帖子主要是討論Javascript和使用eval,因爲這是OP所使用的。 – jfriend00

+0

你真的不明白。你仍然沒有做任何事情,遠遠接近他所要求的。 *請*看看我發佈的小提琴。它解釋了你所做錯的一切。 – riwalk

0

您沒有JSON字符串。你確實有一個對象文字。你需要名稱來引號。

{"status":OK, "addresses":[0,1,2,3,4,5]} 
+0

OP沒有使用JSON解析器,只是eval所以真的只是需要它是有效的JavaScript,它需要引號圍繞「OK」而不是對象鍵。 – jfriend00

0

基於此評論:

所以我覈實,當從收到請求JSON,所有被"改爲「......難道這是問題

是的,一個JSON解析器期望接收JSON作爲輸入,而不是HTML編碼的JSON