JSON.stringify额外参数
首先,创建一个待转换的对象
const book = {
"title": "lalalala",
"authors": [
"lily",
"lmy"
],
"edition": 3,
"year": 2011
};
第二个参数
为数组时
const jsonText = JSON.stringify(book, ['title', 'year']);
// 打印出来
// {"title":"lalalala","year":2011}
为函数时
const jsonText = JSON.stringify(book, function(key ,value){
switch(key){
case "authors":
return value.join(",");
case "year":
return 2000;
default:
return value;
}
});
// 打印出来
// {"title":"lalalala","authors":"lily,lmy","edition":3,"year":2000}
因此,第二个参数也喜欢被叫做“过滤器”参数。需要注意的是,“函数过滤器”中,switch
的default
必须要写的,否则,转换为undefined
第三个参数
为数字
// 空白缩进4个字符,最大为10,大于10则自动转为10
const jsonText = JSON.stringify(book, null, 4);
为字符串
// 字符串替代空白缩进,当然字符串最大长度也是10,超过会被截取
const jsonText = JSON.stringify(book, null, '-lala-');
JSON.stringify的过滤机制(toJSON)
const book = {
"title": "lalalala",
"authors": [
"lily",
"lmy"
],
"edition": 3,
"year": 2011,
"toJSON"(){
return this.title;
}
};
const jsonText = JSON.stringify(book, ['edition', 'year']);
// 打印出来
// "lalalala"
那么toJSON,“过滤器”他们的优先级是怎么样的呢?
- 首先检查被转化的对象是否存在
toJSON
的方法,如果存在则调用该方法,否则,按照默认顺序序列化
- 如果传入第二个参数,则用这个函数过滤器。传入过滤器的值是第一步返回的值。
- 对第二步返回的每个值进行相应的序列化
- 如果提供了第三个参数,执行相应的格式化。
toJSON有什么用呢
const book = {
"title": "lalalala",
"date": "2011-09-11"
"authors": [
"lily",
"lmy"
],
"edition": 3,
"year": 2011,
"toJSON"(){
return this.title;
},
"toJSON"(){
return {
title: this.title,
year: this.year,
time: new Date(this.date).getTime()
}
}
};
const jsonText = JSON.stringify(book, ['time', 'year']);
// 打印出来
// {"time":1536624000000,"year":2011}
当然,此处只是举个小例子,为以后业务数据转换提供一个思路
JSON.parse额外参数
JSON.parse
只接受两个参数,第二个参数则是“过滤器”参数
const book = {
"title": "lalalala",
"date": "2018-09-11",
"authors": [
"lily",
"lmy"
],
"edition": 3,
"year": 2011,
toJSON(){
return {
title: this.title,
year: this.year,
time: new Date(this.date).getTime()
};
}
};
const jsonText = JSON.stringify(book, ['time', 'year', 'title']);
const bookCopy = JSON.parse(jsonText, function(key, value) {
if(key === 'title'){
return 'lalala';
} else {
return value;
}
});
// 打印出来
// {time: 1536624000000, year: 2011, title: "lalala"}
注意,这里的“过滤器”参数中的函数,也要返回默认值,即if
必须有else
结尾,switch
必须有default
,否则最终得到的是undefined
。当然,综合性能和代码美观,建议选择switch
。
感谢阅读~
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。