实际上,JSON.stringify()除了要序列化JavaScript对象外,还可以接受另外两个参数,这两个参数用于指定以不同的方式序列化JavaScript对象。第一个参数是个过滤器,可以使一个数组,也可以是个函数;第二个参数是一个选项,表示是否在JSON字符串中保留缩进。单独或组合使用者两个参数,可以更全面深入地控制JSON的序列化。

1. 过滤器(第一个参数)

1.数组

1
2
3
4
5
6
7
8
9
10
var hero = {
"name": "MasterYi",
"skills": [
"AlphaStrike"
],
"type": "Warrior"
}

var jsonTxt = JSON.stringify(hero, ["name", "type"]);
jsonTxt --> "{"name":"MasterYi","type":"Warrior"}"

2.函数
1
2
3
4
5
6
7
8
9
10
11
var jsonTxt = JSON.stringify(hero, function(k, v){
switch(k){
case "name":
return "Annie";
case "type":
return "Mage";
default:
return v;
}
});
jsonTxt --> "{"name":"Annie","skills":["AlphaStrike"],"type":"Mage"}"

值得注意的是,如果函数返回了undefined,那么相应的属性会被忽略。另外请务必写上default,此时返回传入的值,以便其他值都能正常出现在结果中

2. 选项(字符串缩进)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var jsonTxt1 = JSON.stringify(hero, null, 2);
jsonTxt1 -->
"{
"name": "MasterYi",
"skills": [
"AlphaStrike"
],
"type": "Warrior"
}"

var jsonTxt2 = JSON.stringify(hero, null, 4);
jsonTxt2 -->
"{
"name": "MasterYi",
"skills": [
"AlphaStrike"
],
"type": "Warrior"
}"

如上,结果字符串中也插入了换行符,这样一来就提高了可读性。只要传入有效的控制缩进的参数值,结果字符串就会包含换行符。最大缩进空格数为10,大于10会默认转换为10.