这是解析JSON的好方法吗?

时间:2011-06-29 16:06:55

标签: javascript json

我正在查看另一个解析一些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的好方法吗?

5 个答案:

答案 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。让我们看一下MDCeval所说的内容:

  

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 };

然后object1object2将是两个不同但相同的对象。

答案 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部分内容 - 否则不会有此风险。

相关问题