2011-02-08 77 views
0

我試圖JSON對象轉換爲使用下面的一個「正常」的對象......將JSONobj轉換爲Obj無法正常工作?

 var slaobj = eval('('+s+')'); 

S爲JSON。然而,它似乎並沒有工作(這是'。長'回來未定義)。我究竟做錯了什麼?

+1

可以ü提供JSON字符串的樣本?而.length是一個屬性 - 不是一個函數,對吧? (只是檢查) – DashK 2011-02-08 13:45:18

回答

3

這是`。長度」是回來爲未定義

它不一定有length財產,除非它是一個數組或具有一個其他對象。例如:

var json = '{"foo": "Value of foo"}'; 
var obj = eval('(' + json + ')'); 
alert(obj.foo); // alerts "value of foo" 
alert(obj.length); // alerts "undefined", there's no `length` in `obj` 

Live example


題外話:使用eval反序列化JSON文本可以是一個安全問題,除非你可以明確地信任JSON文本的來源(例如,它是你自己的服務器,你通過SSL連接),因爲eval不解析JSON,它解析並運行JavaScript代碼。 (添加圓括號並不能真正幫助你。)你可以選擇使用Douglas Crockford的(他是JSON的發明者)的eval。最後我檢查了一下,有三種替代方案,其中兩種根本不使用eval;有關詳細信息,請參閱頁面底部的自述文件。

+0

`json2.js`仍然使用`eval`(經過一些檢查)。你也可以看看[json-sans-eval](http://code.google.com/p/json-sans-eval/)。 – 2011-02-08 14:09:55

+0

@Marcel:`json2.js`的確,是的(在使用正則表達式去除大多數事物之後),但是`json_parse.js`和`json_parse_state.js`(也在該鏈接上)不會。這就是我的意思是「替代品」。 `json2.js`使用正則表達式+`eval`,`json_parse.js`是一個遞歸下降解析器,`json_parse_state.js`是一個狀態機。 – 2011-02-08 15:03:55

1

對象並不都具有「.length」屬性。對象文字如:

{ 'foo': 100, 'bar': 'Abraham Lincoln' } 

描述了一個沒有「.length」屬性的對象。

JavaScript Array由於語言運行時的工作方式,對象具有「.length」屬性。但是,如果你把它放在那裏,JavaScript中的一個普通對象只有這樣一個屬性。

0

更新:啊,我明白了,這就是括號裏的內容。大鼠。刪除了第一部分。

但是,這仍然有效:

不要使用eval!

的eval()是一個危險的功能,這 執行它與呼叫者的 權限通過代碼。如果您運行 eval()的字符串可能是 受惡意方的影響,您可能會在 用戶的計算機上以 的權限在您的網頁/擴展程序上運行惡意代碼。更重要的是,第三方代碼可以看到 eval()被調用的範圍, 可能導致可能的攻擊,其中類似的功能是 不容易受到攻擊。

來源:Mozilla JavaScript Reference: eval()

0

你是如何獲取的對象?

我會說必須有其他錯誤 - 你確定'''JSON對象被正確返回? JSON.org

要將JSON文本轉換爲對象,可以使用eval()函數。 eval()調用JavaScript編譯器。由於JSON是JavaScript的一個真正的子集,因此編譯器將正確地解析文本並生成對象結構。文本必須包裝在parens中以避免跳出JavaScript語法中的歧義。

var myObject = eval('(' + myJSONtext + ')'); 
0

http://www.jsonlint.com/這個網站有,你應該在您的處置所有的時候,良好的JSON字符串驗證。當它真的很大時,驗證JSON字符串是很好的。

也不要用eval()來獲取JSON對象。 Visit http://www.json.org/它有非常好的指導線檢查它。

今天有很多JavaScript庫提供JSON API。爲了安全起見,我會建議你使用其中之一。

http://api.jquery.com/jQuery.getJSON/

http://developer.yahoo.com/yui/json/

http://dojotoolkit.org/reference-guide/dojo/_base/json.html