2014-03-13 63 views
2

我有一個無效的JSON字符串,我需要解析到一個對象,並饋送到視圖模型:如何使用eval()正確解析無效的Json

var s = "{ a: new Date(1400000000000) }"; // from a server, can't change this 
eval("var b = " + s);      // parse it to a var b 
var vm = new viewmodel(b);    // pass var b to the viewmodel 

這工作,但我最終的中間對象b之前,我可以使用解析的對象

所以,我想:

var s = "{ a: new Date(1400000000000) }"; // from a server, can't change this 
var vm = new viewmodel(eval(s));   // parse the object and pass to viewmodel 

但不起作用

你能解釋一下爲什麼嗎?

是否有另一種方法可以做到這一點,而不需要中間var b?

+1

eval()不會返回任何東西 – Sarath

回答

4

嘗試以這種方式

var vm = new viewmodel(eval('(' + s + ')')); 
+0

您的答案當然也是正確的,但我決定接受Aegis',因爲他的解釋 – Heras

-1

解析JSON是使用JSON.parse()的最佳方式使用。 eval()不是很安全。

var vm = new viewmodel(JSON.parse(s)); 
+3

他們的字符串's'不是有效的JSON,如問題中所述,所以'JSON.parse()'預計會失敗。 –

+0

是的。我的錯。 –

0

另一種方式做,這是進入這兩個{ a: 3, b: 7 }({ a: 3, b: 7 })

var s = "{ a: new Date(1400000000000) }"; 
var vm = new viewmodel(new Function('return ' + s).call()); 

使用eval的區別在於,這種方式的代碼(s無法訪問本地變量,因爲代碼在單獨的函數範圍中運行。

+0

我很好奇;將整個事件包裝在函數中而不是StatementExpression中的性能成本是多少? – Aegis

+0

並不意味着要低估這一點。自10小時過去後,我現在無法改變我的投票。我更喜歡這種可怕的'eval'的方法,並確實想要upvote它。 – TaeKwonJoe