JavaScript的JSON对象自己就带有序列化和反序列化的函数,为 parse 和 stringify,咱们通常使用这两个函数将JSON对象持久化。
如:
前端
var Persion = {
username: "Kris",
password: "1234567890"
}
alert(JSON.stringify(Persion)) //{"username":"Kris","password":"1234567890"}
美中不足的是stringify这个函数会把全部属性都进行转换,但有时侯咱们但愿排除一些属性,好比上面的 password。
json
stackoverflow 上面的这篇问答提供了一种解决方案。即复写toJSON方法:
后端
var Message = function() {
this.myPrivateProperty = "Secret message";
this.myPublicProperty = "Message for the public";
this.toJSON = function() {
return {
"public": this.myPublicProperty
};
};
}
alert(JSON.stringify(new Message())); // {"public":"Message for the public"}
JSON在调用stringify时会先检测该对象的toJSON接口是否存在,若是存在则使用对象自己的toString进行序列化。复写toJSON不光能够应用在基于function构造的对象上,还能够应用在基于Object的对象上,如:
函数
var Persion = {
name : 'Kris'
, password : 1234567890
, toJSON : function() { return { name: this.name } }
};
alert(JSON.stringify(Persion)); // {"name": "Kris"}
复写toJSON须要实现额外一个接口,在ES5有一个defineProperty方法能够实现经过配置参数来定义一些特殊的属性,好比能够将此属性设置为不可枚举:
var Persion = { name: "Kris", password: "1234567890" }
//设置属性
Object.defineProperty(Persion, "password", { enumerable: false })
alert(Persion.password); //1234567890
alert(JSON.stringify(Persion)); // {"name": "Kris"}
其实上defineProperty还有一些更高级的属性,如为属性添加get/set方法等,但因不兼容老版IE,所以在前端使用的并很少,多用于后端Node.JS中。this