使用原生 JSON 提升安全性与性能

用于表示数据的 JavaScript 对象表示法 (JSON) 机制已迅速成为 Web 开发人员工具包中不可或缺的一部分,它允许 JavaScript 应用程序直观地获取和解析数据,并在脚本中使用轻量级的数据封装。 Firefox 3.5 通过向顶级对象公开一个新的原语 - window.JSON - 本地支持 JSON

JSON 的原生“开箱即用”支持得益于 ECMAScript 第 5 版 (PDF 规范链接),该规范的其他方面也将 得到 Firefox 3.5 的支持。目前,原生 JSON 受 Firefox 3.5IE8 支持,其他浏览器很快也可能会支持它。

原生 JSON 支持有两个优势

  1. 安全性。仅仅使用 eval 来评估作为字符串返回的表达式会引发 安全问题。此外,原生 JSON 原语只能处理数据。它不能用于解析包含方法调用的对象;尝试这样做会返回错误。
  2. 性能。使用第三方脚本和库安全地解析 JSON 可能会比浏览器中原生 JSON 解析慢。

让我们看一些示例。

搜索结果的 JSON API 可能如下所示

/*
Assume that you obtained var data
as a string from a server
For convenience we display this search
result on separate lines
*/

var data = ' { "responseData":
{"results": [
    {
        "SafeSearch":"true",
        "url":"http://www.arunranga.com/i.jpg",
    },
    {
        "SafeSearch":"false",
	 "url":"http://www.badarunranga.com/evil.jpg",
    }
]}}';

此类资源可以通过使用 RESTful API 的简单 HTTP GET 请求返回。

使用原生 JSON,您可以执行以下操作

/*
 Obtain a handle to the above JSON resource
 This is best and most conveniently done
 via third-party libraries that support native JSON
*/

if (window.JSON) {
    var searchObj = JSON.parse(data);
    for (var i=0; i++; i < searchObj.responseData.results.length) {
        if (searchObj.responseData.results[i].SafeSearch) {
            var img = new Image();
            img.src = searchObj.responseData.results[i].url;
            // ... Insert image into DOM ...
    }
}

您还可以将对象序列化回字符串

// Back to where we started from

var data = JSON.stringify(searchObj);

// data now holds the string we started with

当然,要真正发挥 JSON 的强大功能,您需要通过 JSONP 等回调机制从不同域检索 JSON 资源。许多 Web 开发人员不太可能直接使用 JSON 原语。相反,他们会在 DojojQuery 等库中使用它们。这些库允许从不同域检索和直接解析 JSON 资源,并为回调和 DOM 插入过程添加大量语法糖。

原生 JSON 原语与流行的 json2.js 库(它会正确检测是否启用了原生 JSON)一起工作,因此开发人员可以在不支持原生 JSON 的浏览器上无缝地使用 JSON 解析。在撰写本文时,Dojo 和 jQuery 已经承诺支持原生 JSON。

关于 Arun Ranganathan

更多 Arun Ranganathan 的文章…


6 条评论

  1. Barryvan

    也许值得注意的是,几乎所有主要的 JavaScript 框架都将(或已经)支持原生 JSON,包括 MooTools (https://mootools.lighthouseapp.com/projects/2706/tickets/607-native-json-support-in-firefox-31)。

    2009 年 6 月 16 日 下午 5:16

  2. Yongbin

    原生支持很好。但是,Firefox 3.0.* 通过 JSON.jsm 支持原生 JSON。方法是 Object.toString() 和 fromString()。为什么在 Firefox 3.5 中更改方式?这给扩展开发人员带来了麻烦,需要同时支持 3.0.* 和 3.5。

    2009 年 6 月 16 日 下午 7:10

  3. […] 原文地址:better security and performance with native JSON 系列地址:颠覆网络35天 […]

    2009 年 6 月 16 日 下午 10:50

  4. kwerboom

    @Yongbin

    访问 https://mdn.org.cn/En/Updating_extensions_for_Firefox_3.5https://mdn.org.cn/en/JSON。您可以阅读有关 JSON 支持以及如何处理 Firefox 3.0 和 3.5 支持的部分。至于切换,在本文的第二段中对此有很好的解释。

    2009 年 6 月 17 日 上午 1:36

  5. […] co ciekawsze artykuły z Mozilla Hacks na polski. Na Techblogu zacznę od artykułu „Better security and performance with native JSON”, autorstwa Aruna […]

    2009 年 6 月 17 日 下午 2:40

  6. […] 原文地址:better security and performance with native JSON 系列地址:颠覆网络35天 […]

    2009 年 7 月 27 日 上午 1:10

本文评论已关闭。