打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
JSON序列化(stringify)对象时排除某些属性的两种方法

JavaScript的JSON对象本身就带有序列化和反序列化的函数,为 parse 和 stringify,我们一般使用这两个函数将JSON对象持久化。

如:

var Persion = {    username: "Kris",    password: "1234567890"}alert(JSON.stringify(Persion))   //{"username":"Kris","password":"1234567890"}

美中不足的是stringify这个函数会把所有属性都进行转换,但有时侯我们希望排除一些属性,比如上面的 password。

用toJSON隐藏对象的某些属性

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"}

在Object上定义隐藏属性

复写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中。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
JSON解析与序列化
如何解决使用JSON.stringify时遇到的循环引用问题
JSON的自定义序列化和解析
实现SpreadJS JSON的导入导出
JSON 格式数据的定义及操作
JSON.stringify() 的 5 个秘密特性
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服