zoukankan      html  css  js  c++  java
  • 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中。

  • 相关阅读:
    windows服务的默认启动类型和登录帐户
    oracle通过sql随机取表中的10条记录
    oracle如何四舍五入?
    Sql Server数据库自增长字段标识列的插入或更新修改操作办法
    将一个表中的数据导入到另一张表中
    设计模式已经陨落了?
    LINQ架构简单描述
    Asp.Net 验证控件
    .Net 三层架构开发初步
    C++编程思想
  • 原文地址:https://www.cnblogs.com/Red-ButterFly/p/8393790.html
Copyright © 2011-2022 走看看