我正在查看另一个解析一些JSON的开发人员代码。我真的不知道它是如何工作的,或者它是一个好主意......
hmlPlaylist.prototype.loadVideos_callback = function (data) {
var jsonData = '';
var jsonError = false;
try {
jsonData = eval("(" + data + ")");
} catch (jError) {
jsonError = true;
}
if (!jsonError) {
if (jsonData.playlists.length > 0) {
this.buildPlaylistList(jsonData.playlists);
}
if (jsonData.videos.length > 0) {
this.buildVideoList(jsonData.videos);
this.bindVideoNavs();
}
}
else {
// no json returned, don't do anything
}
};
它的行
jsonData = eval("(" + data + ")");
这让我受益匪浅。这对数据有什么影响?我以为你必须使用一个extarnal类库来解析JSON数据?
我后来可以看到他像这样迭代这个集合:
for (var i = 0; i < playlistCount; i++) {
var p = playlists[i];
这真的是一种通过JSON的好方法吗?
答案 0 :(得分:1)
JSON.parse(stringOfJson)
是解析json的最佳方法。如果您正在使用jquery,那么您可以告诉$.ajax
您需要json,并使用dataType: 'json'
配置选项
答案 1 :(得分:1)
不要那样做。这样做:https://github.com/douglascrockford/JSON-js
Javascript推荐的最佳JSON解析器之一。
答案 2 :(得分:1)
大多数现代浏览器都支持本机JSON.parse
方法。如果您的目标浏览器没有,则可以使用Douglas Crockford提供的here实现(滚动到底部)。
在任何情况下,如果完全可以避免,请不要使用eval
。
更新(关于eval
):
正如JSON.org所述:
JSON是对象文字的子集 JavaScript的表示法。因为JSON是 JavaScript的一个子集,可以使用它 用语言没有麻烦或大惊小怪。
这在实践中意味着什么?嗯,这意味着任何有效的JSON对象也是有效的JS代码(在技术术语中:它是一个有效的JS表达式,其值为对象文字)。因此,您可以将JSON粘贴到文件中并告诉例如你的浏览器将它作为JavaScript加载它会这样做而没有任何错误或警告(当然“JavaScript”实际上不会做任何东西,因为它只是对象的表示而不是程序代码)
由于我们确定JSON可以解释为JavaScript,因此也可以将其传递给eval
。让我们看一下MDC对eval
所说的内容:
eval函数的参数是a 串。如果字符串代表一个 表达式,eval评估 表达
...
解析JSON(将字符串转换为JavaScript对象)
如果您正在调用
eval()
on的字符串包含数据(例如,数组:"[1, 2, 3]"
),而不是代码,则应考虑切换到允许字符串使用的JSON用于表示数据的JavaScript语法子集。
以上可能不是最好的解释,但确实说明了会发生什么:JSON可以看作是一个JS表达式。 eval
接受表示JS表达式的字符串(在本例中为包含JSON的字符串),对其进行求值,并返回结果。它就像一个迷你编译器,你可以在运行时提供代码,它将为你运行代码并返回结果。在这种情况下,结果将是一个JS对象(如前所述,JSON是一个表示对象的有效JS表达式。)
所以,如果你有
var json = '{"foo": "bar", "answer": 42}';
var object1 = eval(json);
var object2 = { foo: "bar", answer: 42 };
然后object1
和object2
将是两个不同但相同的对象。
答案 3 :(得分:1)
JSON是java脚本代码。
jsonData = eval("(" + data + ")");
eval()
函数正在执行java脚本代码并返回结果(对象)。您可以找到有关eval
here。
问题是,eval
函数也可以执行普通的java脚本代码,这是不安全的。请改用JSON.parse(data)
。
答案 4 :(得分:1)
eval
只运行提供给它的任何字符串,就好像它是代码一样。如果您将JSON作为字符串提供,它会将字符串计算为代码,然后生成JSON对象。 eval
对于解析JSON是合法的,尽管由于存在更好的方法(JSON.parse
,jQuery的$.ajax
带有{"json"
,因此这个论点的论据变得相当弱。 1}} datatype
或$.getJSON
)。
有关参数eval
接受及其产生的示例:
var a = {foo: [0, 1], bar: {baz: 2}};
var b = JSON.stringify(a);
alert(b); // alerts '{"foo":[0,1],"bar":{"baz":2}}'
var c = eval("(" + b + ")");
alert(c.foo); // alerts '0,1'
alert(c.bar.baz); // alerts '2'
至于eval
的安全性,只要它只接受来自您的服务器的格式良好的JSON,不受用户输入的影响,风险就相当小。风险,FWIW,是一些用户提供JS代码作为一个字符串,将注入一个脚本,然后可以用来收集访问该页面的其他用户的敏感信息。 JSON.parse
- 除非您事后eval
部分内容 - 否则不会有此风险。