如何正确使用eval()来解析无效的Json

时间:2014-03-13 10:38:58

标签: javascript json eval

我有一个无效的Json字符串,我需要解析一个对象并提供给一个viewmodel:

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

但这不起作用

你能解释一下原因吗?

是否有其他方法可以在不需要中间变量b的情况下完成此操作?

4 个答案:

答案 0 :(得分:4)

尝试以这种方式使用

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

答案 1 :(得分:2)

你需要包装对象表达式(它不仅仅是一个有效的语句):

var s = "{ a: 3, b: 7 }";
var obj = eval('(' + s + ')');

毋庸置疑,eval并不安全,但如果您别无选择......请注意,这将执行服务器发送给您的任何代码。 C.F. Why is using the JavaScript eval function a bad idea?有关此事的更全面的讨论


额外的乐趣:尝试在在线esprima解析器中输入{ a: 3, b: 7 }({ a: 3, b: 7 }) :) http://esprima.org/demo/parse.html

答案 2 :(得分:0)

另一种方法是:

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

使用eval之间的区别在于,代码(s无法访问本地变量,因为代码在单独的函数范围内运行

答案 3 :(得分:-1)

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

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