JSON.Stringify的几种情况
情况1:含有toJSON方法的字符串,在调用stringify的时候调用toJSON方法
var obj={name:"xxx",sex:'female',toJSON:function(){return "xxx";}};
console.log(JSON.stringify(obj));
这时候调用toJSON方法得到结果为"xxx"!这种方式在jQuery的源码中也用到了,主要用于防止外界调用stringify而暴露敏感信息:
if ( !cache[ id ] ) {
// Avoid exposing jQuery metadata on plain JS objects when the object
// is serialized using JSON.stringify
cache[ id ] = isNode ? {} : { toJSON: jQuery.noop };
}
在这里主要是为了防止用户调用stringify而暴露数据仓库的内容(详见
jQuery源码分析之深入理解jQuery.data,jQuery._data以及data实例函数十八问)
情况2:toJSON如果第二个参数是数组,那么只是序列化数组里面的字段
var obj={name:"xxx",sex:'female'};
console.log(JSON.stringify(obj,["sex"]));//只是弹出"sex":"female"
情况3:如果stringify里面第二个参数是函数,传入的函数接受两个参数,属性名和属性值,属性名只能是字符串,同时如果值并非键值对的情况下,键名可以是空字符串
var book={
title:"xxx",
edition:4,
year:2014
}
console.log(JSON.stringify(book,function(key,value)
{
//对key是year的字符串不进行序列化!
if(key==="year")
{
return undefined;//返回undefined表示属性忽略
}
//其它的字段正常序列化,打印{"title":"xxx","edition":4}
else
{
return value;
}
}));
情况4:如果传入了第四个参数是数字那么表示缩进的空格个数(空格个数必须小于10,大于10都会自动缩小为10),如果是其它字符那么就在每一个键名前面添加指定的字符
var book={
title:"xxx",
edition:4,
year:2014
}
console.log(JSON.stringify(book,null,"--"));
//"--"在JSON字符串中作为缩进字符,也就是每一个字段如"title/edition/year"前面添加"--"!
console.log(JSON.stringify(book,null,6));
//每一个前面添加6个空格