我試圖JSON對象轉換爲使用下面的一個「正常」的對象......將JSONobj轉換爲Obj無法正常工作?
var slaobj = eval('('+s+')');
S爲JSON
。然而,它似乎並沒有工作(這是'。長'回來未定義)。我究竟做錯了什麼?
我試圖JSON對象轉換爲使用下面的一個「正常」的對象......將JSONobj轉換爲Obj無法正常工作?
var slaobj = eval('('+s+')');
S爲JSON
。然而,它似乎並沒有工作(這是'。長'回來未定義)。我究竟做錯了什麼?
這是`。長度」是回來爲未定義
它不一定有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`
題外話:使用eval
反序列化JSON文本可以是一個安全問題,除非你可以明確地信任JSON文本的來源(例如,它是你自己的服務器,你通過SSL連接),因爲eval
不解析JSON,它解析並運行JavaScript代碼。 (添加圓括號並不能真正幫助你。)你可以選擇使用Douglas Crockford的(他是JSON的發明者)的eval
。最後我檢查了一下,有三種替代方案,其中兩種根本不使用eval
;有關詳細信息,請參閱頁面底部的自述文件。
`json2.js`仍然使用`eval`(經過一些檢查)。你也可以看看[json-sans-eval](http://code.google.com/p/json-sans-eval/)。 – 2011-02-08 14:09:55
@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
對象並不都具有「.length」屬性。對象文字如:
{ 'foo': 100, 'bar': 'Abraham Lincoln' }
描述了一個沒有「.length」屬性的對象。
JavaScript Array由於語言運行時的工作方式,對象具有「.length」屬性。但是,如果你把它放在那裏,JavaScript中的一個普通對象只有這樣一個屬性。
更新:啊,我明白了,這就是括號裏的內容。大鼠。刪除了第一部分。
但是,這仍然有效:
不要使用eval!
的eval()是一個危險的功能,這 執行它與呼叫者的 權限通過代碼。如果您運行 eval()的字符串可能是 受惡意方的影響,您可能會在 用戶的計算機上以 的權限在您的網頁/擴展程序上運行惡意代碼。更重要的是,第三方代碼可以看到 eval()被調用的範圍, 可能導致可能的攻擊,其中類似的功能是 不容易受到攻擊。
你是如何獲取的對象?
我會說必須有其他錯誤 - 你確定'''JSON對象被正確返回? JSON.org
要將JSON文本轉換爲對象,可以使用eval()函數。 eval()調用JavaScript編譯器。由於JSON是JavaScript的一個真正的子集,因此編譯器將正確地解析文本並生成對象結構。文本必須包裝在parens中以避免跳出JavaScript語法中的歧義。
var myObject = eval('(' + myJSONtext + ')');
http://www.jsonlint.com/這個網站有,你應該在您的處置所有的時候,良好的JSON字符串驗證。當它真的很大時,驗證JSON字符串是很好的。
也不要用eval()來獲取JSON對象。 Visit http://www.json.org/它有非常好的指導線檢查它。
今天有很多JavaScript庫提供JSON API。爲了安全起見,我會建議你使用其中之一。
http://api.jquery.com/jQuery.getJSON/
可以ü提供JSON字符串的樣本?而.length是一個屬性 - 不是一個函數,對吧? (只是檢查) – DashK 2011-02-08 13:45:18