谋智社区

火狐浏览器在中国

« PreviousNext »

颠覆网络35天 ─ 使用本地JSON获得更好的安全和性能

27 July 2009

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

====================================

使用JavaScript对象标记(JSON,下面都会说JSON)来呈现数据已经迅速地成为互联网开发人员工具箱中不可或缺的一部分,他可以让JavaScript应用非常容易的在脚本语言范畴内获取和解析数据。Firefox 3.5 包含了对JSON的本地方法(更接近于机器实现而不是使用脚本语言实现)支持,并且提供了window.JSON 这样的顶级对象。

本地支持的JSON来自ECMAScript第五版(链接为规范的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”,
    }
]}}’;

这样的结果可以非常简单的通过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的能力,您可以从不同的域获取大量的JSON数据,需要通过类似JSONP的调用方式。很多网页开发人员不太喜欢直接使用JSON调用。他们更喜欢在库中使用,例如DojojQuery等。这些库允许从不同的域直接获取和解析JSON资源,并且有很多语法糖支持处理的回调和DOM插入等等。

本地JSON调用同流行的json2.js库配合的很好──可以正确的检测到是否支持本地JSON──所以,程序员们可以使用同样的方法在任何浏览器上工作。到本文写作的时候,Dojo和jQuery都已经明确表示会支持本地JSON:

Posted in 颠覆网络35天 | Trackback | del.icio.us | Top Of Page

No comments yet

Leave a Reply