平时我们用JSON.parse
或者JSON.stringify
的时候,经常只会传入一个参数,即:要序列化的对象或者反序列化的对象字符串.实际上这两个方法都可以传入第2个function参数去处理对应的value值.
function函数支持两个参数key,value分别对应处理后的key,value,可以通过函数去动态改变对应的value值.
//JSON.stringify 示范代码.
let data = {
test: 'test',
msg: '成功',
data: {
value: 1,
text: 'hello',
time: new Date()
},
time: new Date(),
fun: function (a, b) {
console.log(a + b);
}
}
let jsonStr = JSON.stringify(data, (key, value) => {
switch (key) {
case 'test':
return undefined; //返回undefined,最终不会序列化
case 'time':
return value.replace('T', ' ');
default:
if (typeof value === 'function') {
//简单处理函数的序列化方式,实际上真正的处理要复杂的多
return value.toString();
}
return value;
}
}, 4); //stringify还支持第3个参数格式化字符串(4代表4个空格,也可以输入字符串去代替.)
使用JSON.stringify的时候也要注意对象是否有toJSON
这个方法.如果存在的话最终序列化会调用toJSON这个方法(一般情况不太可能重写js的序列化方法)
同样的,JSON.parse也支持第2个参数去处理最终的value值.
let jsonObj = JSON.parse(jsonStr, (key, value) => {
if (key === 'time') {
return new Date(value);
} else if (typeof value !== 'object' && /^function/.test(value)) {
//简单的对函数进行处理.
return eval('(' + value + ')');
}
return value;
});
这让我们有些情况下处理序列化及反序列化得到很大的灵活性,不过似乎没有找到修改key的办法(除了改写toJSON),如果有的话请千万告诉我.^_^