先更正一个概念,JSON是一种数据表达的格式(见 RFC-4627),就像我们平常说的xml、csv一样。它本身不是数据,也不依赖于具体编程语言。用.net、Java或者Python都能生成JSON格式的数据。
JSON对象(JSON Object)(中文文档见 这里)这个术语是有的,它是全局对象众多属性中的一个。它包含两个函数:parse和stringify,用于解析和构造JSON文本。但是JSON对象跟 对象初始化(Object Initialiser)(中文文档见 这里)是两码事,后者用于以直接量的方式初始化一个对象,比如

1
var a = { myField: 'myValue' };

注意不要弄混了。

其实JSON.stringify和JSON.parse的参数都不止一个,根据ECMAScript 5.1规范,两者的声明分别是:

1
2
JSON.stringify(value [ , replacer [ , space ] ] )
JSON.parse(text [ , reviver ] )

这就使得我们可以控制序列化和反序列化的过程。比如下面的代码模拟了一个让函数在序列化并反序列化后仍旧保持不丢失的情况。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var obj = {
myField: 'myValue',
myFunction: function() {
console.log('function is not able to be serialized');
}
};
function replacer(key, value) {
if(typeof value === 'function') {
return '__function';
} else {
return value;
}
};
var JSONString = JSON.stringify(obj, replacer);
function reviver(key, value) {
if (value === '__function') {
return function() {
console.log('function restored by reviver');
};
} else {
return value;
}
}
var restoredObj = JSON.parse(JSONString, reviver);
restoredObj.myFunction();

值得注意的是,除了函数外,replacer还支持其他几种类型。有兴趣的请翻阅 ECMAScript规范相关部分(中文版见 这里)。最有意思的是,你还可以通过定义toJSON函数来自定义序列化的过程。