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

How to use eval() properly to parse Invalid Json

本文关键字:无效 Json 何正确 eval      更新时间:2023-09-26

我有一个无效的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

但这不起作用

你能解释为什么吗?

是否有另一种方法可以做到这一点,而不需要中间变量b?

尝试这样使用

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

您需要包装对象表达式(它不是单独的有效语句):

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

不用说eval是不安全的,但是如果你别无选择…请注意,这将执行服务器发送给您的任何代码。为什么使用JavaScript的eval函数是一个坏主意?为了更深入地讨论这件事


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

另一种方法是:

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

使用eval的区别在于,这样代码(s) 不能访问局部变量,因为代码在单独的函数作用域中运行。

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

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