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}
因此,第二个参数也喜欢被叫做“过滤器”参数。需要注意的是,“函数过滤器”中,switchdefault必须要写的,否则,转换为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,“过滤器”他们的优先级是怎么样的呢?
  1. 首先检查被转化的对象是否存在toJSON的方法,如果存在则调用该方法,否则,按照默认顺序序列化
  2. 如果传入第二个参数,则用这个函数过滤器。传入过滤器的值是第一步返回的值。
  3. 对第二步返回的每个值进行相应的序列化
  4. 如果提供了第三个参数,执行相应的格式化。
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
感谢阅读~

远远的飞梦
53 声望12 粉丝

人的意志可以创造梦想