2012-09-30 44 views
0

我正在編寫一個腳本,我需要在不支持JSON.parse()的瀏覽器中解析JSON。我有嚴格的大小目標(總大小爲< 20 kb),所以我不能依賴像jQuery這樣的外部庫。腳本標記來解析JSON:它工作嗎?

通常的做法是使用eval(),但我擔心它不安全,因爲我無法控制JSON字符串(由外部源提供)。

我想出了主意,使用腳本標籤來創建我的對象:

var json='{"name":"Me","age":"30"}'; 
var scr=document.createElement("script"); 
scr.innerHTML="var obj="+json; 
document.body.appendChild(scr); 

這似乎是工作,這表現在這裏: http://jsfiddle.net/bz8f7/

我在這裏失去了一些東西?有沒有我的方法不能工作或不安全的情況?

注意:我知道這個方法創建了一個全局變量,對於我的用例我沒有問題。

+3

爲什麼不只是使用eval?它實際上等於你想要做的事情。你的方法與eval完全一樣安全,這意味着:不安全 –

+1

@JanusTroelsen由於在問題中解釋的原因(腳本注入的風險) – Christophe

+0

使用'script'標記不會比'eval'更安全。在這兩種情況下,你都在執行給定的代碼。唯一不同的是你的腳本版本正在全局執行它,但你可以通過'Function'構造函數來實現它。仍然不安全,但阻止訪問局部變量。 –

回答

0

您仍在評估JavaScript,只是使用比eval更復雜,效率更低的方法。它具有所有eval的安全問題。

+0

doh! thx,我剛剛投票結束這個問題。 – Christophe

1

使用JSON填充像JSON 3。這是一個合適的解析器,這意味着即使沒有本機JSON支持,它也不會使用eval

1

是的,它確實有效。不,它具有與eval完全相同的缺點(也許它由於DOM而更慢,並且如果您不想使用像JSONP那樣的全局函數,它會創建一個全局變量)。

使用JSON.parse,如果您關心舊版瀏覽器,請將其填充。有輕量級的庫可以做到這一點。

0

使用道格拉斯克羅克福德的json2.js,它在縮小前進入小於20K。幾乎所有的瀏覽器實現JSON.parse()都從它開始,所以你不應該有任何兼容性問題。