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

轉載於:https://www.cnblogs.com/Red-ButterFly/p/8393790.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM