能处理的(安全JSON):
通常为对象或者数组,也可以是字符串、数字、布尔值和null,结果都是字符串('aa','33','null','true')
不能处理的(不安全JSON):
undefined
,function
,symbol
,循环引用的对象(自己里面引用了自己)
扩展知识:JSON.stringify在转换之前,如果传入对象中的有.toJSON()
方法,会先调用toJSON()
,用它的返回值再进行字符串化,另可以自行编写toJSON()
方法
参数:
JSON.stringify(json [, replacer] [, space])
除了常用的,只传一个参数,还有另外两个参数replacer
和space
可供选择:
1、replacer
可以传递:
①函数,此函数有两个参数,传入json的key
和value
大家可以打印一下key,和value,看得出对于json是由内而外递归遍历出来的,把嵌套json直接扁平化了,所以我们可以省去还得遍历多层级json的复杂情况,直接在JSON.stringify()
里面操作即可
function replacer(key, value) {
console.log(key,value) //见下key和value注释
if (typeof value === "string") {
return undefined;
}
return value;
}
var foo = {factoryLocation:'shanghai', info: {brand:'tesla',Mileage :{modelY:660,modelX:550}}, month: 9};
var jsonString = JSON.stringify(foo, replacer); // 输出为:"{"info":{"Mileage":{"modelY":660,"modelX":550}},"month":9}"
// key和value:
// {factoryLocation: "shanghai", info: {…}, month: 9}
// factoryLocation shanghai
// info : {brand: "tesla", Mileage: {…}}
// brand tesla
// Mileage : {modelY: 660, modelX: 550}
// modelY 660
// modelX 550
// month 9
②数组:由一个或多个字符串构成的数组,代表指定需要被转换的键值对,其他未指定则忽略:
JSON.stringify(foo, ['week', 'month']);
// '{"week":45,"month":7}', 只保留“week”和“month”属性值。
2、最后一个可选参数space,可以传入制表符等符号代表字符串化后的缩进形式,也可传入数字代表缩进空格数量:
JSON.stringify({ a: 2 }, null, " "); // '{\n "a": 2\n}'
//使用制表符(\t)来缩进:
JSON.stringify({ uno: 1, dos : 2 }, null, '\t')
// '{ \
// "uno": 1, \
// "dos": 2 \
// }'