乐者为王

Do one thing, and do it well.

JSON in JavaScript

英文原文:http://www.json.org/js.html

JavaScript是一门通用编程语言,被作为页面脚本语言引入Netscape Navigator。它仍被广泛地认为是Java的一个子集,但它不是。它是一门有着类C语法soft objects的类Scheme语言,JavaScript在ECMAScript Language Specification, Third Edition中被标准化。

JSON是JavaScript对象字面量表示法(object literal notation)的一个子集。因为JSON是JavaScript的一个子集,所以它可以毫不费力地被用在这门语言中。

1
2
3
4
5
6
var myJSONObject = {"bindings": [
        {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"},
        {"ircEvent": "PRIVMSG", "method": "deleteURI", "regex": "^delete.*"},
        {"ircEvent": "PRIVMSG", "method": "randomURI", "regex": "^random.*"}
    ]
};

在这个例子中,一个含有单个成员“bindings”的对象被创建,该成员包含一个含有三个对象的数组,每个对象含有“ircEvent”,“method”和“regex”三个成员。

成员可以通过点或下标运算符检索。

1
myJSONObject.bindings[0].method    // "newURI"

你可以使用eval函数将一段JSON文本转换成一个对象,eval函数会调用JavaScript编译器。因为JSON是JavaScript的一个真子集(a proper subset),编译器将正确地解析文本并产生一个对象结构。文本必须被包裹在括号内,以免在JavaScript的语法中的歧义上犯错误。

1
var myObject = eval('(' + myJSONtext + ')');

eval函数是非常快的。然而,它可以编译和执行任何JavaScript程序,所以可能会有安全问题。当源代码是可信的与合格的的时候才可以使用eval函数。使用JSON语法分析器则安全的多。在基于XMLHttpRequest的Web应用中,通讯只被允许朝着提供该页面的同源的方向,所以它是可信的。但它可能不是合格的。如果服务器在它的JSON编码里不是严格的,或者它没有严谨地验证所有的输入,然后它可能交付无效的JSON文本,它们可能携带危险的脚本。eval函数将会执行这些脚本,释放恶意。

为抵御这些,应该使用JSON语法分析器。JSON语法分析器将只识别JSON文本,拒绝所有的脚本。在提供本地JSON支持的浏览器里,JSON语法分析器也比eval快的多。预计本地JSON支持将会被包含在下一个ECMAScript标准中。

1
var myObject = JSON.parse(myJSONtext, reviver);

可选的reviver参数是一个函数,它会被最终结果的各个层面上的每个键和值调用。每个值会被reviver函数的返回结果替换。这可以被用来将通用对象改编成为伪类实例,或者被用来将date字符串转化成Date对象。

1
2
3
4
5
6
7
8
9
10
myData = JSON.parse(text, function (key, value) {
    var type;
    if (value && typeof value === 'object') {
        type = value.type;
        if (typeof type === 'string' && typeof window[type] === 'function') {
            return new (window[type])(value);
        }
    }
    return value;
});

JSON stringifier则作相反的工作,它将JavaScript数据结构转换为JSON文本。JSON不支持循环的数据结构,所以注意不要把循环的结构交给JSON stringifier。

1
var myJSONText = JSON.stringify(myObject, replacer);

如果stringify方法看到一个对象包含toJSON方法,它会调用该方法,并字符串化返回的值。这允许一个对象去确定其自己的JSON表示。

stringify~~原文是stringifier,疑似拼错~~方法可以接受一个可选的字符串数组。这些字符串被用于选取那些将会被包含在JSON文本中的属性。

stringify~~原文是stringifier,疑似拼错~~方法可以接受一个可选的replacer函数。该函数会在结构中每个值的toJSON方法(如果有)之后被调用。它将每个键和值作为参数传递,并且this将会被绑定到持有键的对象上。返回的值会被字符串化。

没有在JSON中表示的值(例如函数和undefined)被排除在外。

非有限的数字被替换为null。要替换成其它的值,你可以使用像这样的replacer函数:

1
2
3
4
5
6
function replacer(key, value) {
    if (typeof value === 'number' && !isFinite(value)) {
        return String(value);
    }
    return value;
}

给JSON.parse一个相应的reviver可以还原这些。

The open source code of a JSON parser and JSON stringifier is available. When minified it is less than 2.5K.

Comments