2011-07-27 246 views
3

在我的web服務,我在該方法返回一個JSON對象:解析JSON對象

{name:'xx'} 

使用AJAX來發送請求,然後使用「EVAL」

解析它們
onComplete:function(req){ 
    var data=eval(req.responseText); 
    //do something according data 
} 

但是,我無法獲取'數據'。

當我retrun以下字符串:

[{name:'xx'}] 

它的工作,我也得到了「數據」作爲一個數組。

通過google,我知道它是由返回字符串中的'{'引起的。

所以我想知道是否沒有辦法重啓一個json對象?

+1

可能的重複[爲什麼JavaScript的eval需要括號來評估JSON數據?](http://stackoverflow.com/questions/964397/why-does-javascripts-eval-need-parentheses-to-eval-json-數據) – Quentin

+1

另外,[這不是JSON](http://jsonlint.com)。 – Quentin

+1

此外,eval是一個緩慢,難以調試和危險的方式來解析JSON(尤其是如果它是破JSON)。使用合適的解析器。 jQuery(您似乎正在使用的)內置了一個。如果您返回帶有正確內容類型HTTP標頭(即「application/json」)的JSON,它將自動觸發。 – Quentin

回答

1

請閱讀JSON hijacking上的這篇博文。作者解釋你運行到

問題你可能見過這樣的代碼涉及到JSON時,以下幾點:

eval('('+JSON_DATA+')');

通知開始和結束括號,這是迫使 JavaScript來作爲對象執行數據,而不是上面提到的塊語句 。如果JavaScript確實嘗試執行沒有括號的JSON數據 ,並且JSON數據事實上以「{」 開頭,則會出現語法錯誤,因爲塊語句將是 無效。爲什麼 ...

而不是增加()在你的JSON響應,你應該使用JSON.parse$.parseJSON像gion_13

... 更多信息說。 Eval不是要走的路。

另外,就像quentin在評論中說的那樣,您需要更改您要返回的JSON,因爲它是invalid。你需要引用你的鑰匙以及你的價值。

2

使用JSON.parse或jquery的$.parseJSON - 如果您使用jquery而不是eval。
另外,如果您確實使用jquery,則可以利用內置的ajax方法自動檢索並將響應解析爲json對象:$.getJson

如果你仍然不希望修改的「邏輯」,你可以嘗試用加括號EVAL你的迴應:var data = eval('(' + req.responseText + ')');

0

它的工作,我也得到了「數據」作爲一個數組。

這就是它應該做的。 []是聲明數組的語法。如果你想要內部對象,那麼只需返回{name: 'XX'}