2016-10-17 129 views
5

我正在使用TypeScript中的getter/setter訪問器。因爲它是不可能有變量和方法相同的名字,我開始前綴較低破折號變量,在許多例子來完成:使用JSON.stringify與TypeScript getter/setter

private _major: number; 

get major(): number { 
    return this._major; 
} 
set major(major: number) { 
    this._major = major; 
} 

現在,當我使用JSON.stringify( )方法將對象轉換爲JSON字符串,它將使用變量名稱作爲鍵:_major。

因爲我不希望JSON文件的所有鍵都帶有一個較低的破折號前綴,是否有可能讓TypeScript使用getter方法的名稱(如果可用)?或者還有其他的方式來使用getter/setter方法,但仍然產生一個乾淨的JSON輸出?

我知道有些方法可以在寫入字符串輸出之前手動修改JSON密鑰。我很好奇,如果有更簡單的解決方案。

Here is a JSFiddle它演示了當前的行爲。

+1

I假設另一種方法是使用屬性的大寫,例如獲得Major()...就像屬性的C#命名約定 –

回答

3

不,您不能讓JSON.stringify使用getter/setter名稱而不是屬性名稱。

但你可以做這樣的事情:

class Version { 
    private _major: number; 

    get major(): number { 
     return this._major; 
    } 

    set major(major: number) { 
     this._major = major; 
    } 

    toJsonString(): string { 
     let json = JSON.stringify(this); 
     Object.keys(this).filter(key => key[0] === "_").forEach(key => { 
      json = json.replace(key, key.substring(1)); 
     }); 

     return json; 
    } 
} 

let version = new Version(); 
version.major = 2; 
console.log(version.toJsonString()); // {"major":2} 
+3

參考以下答案,您可以只在您的對象上定義了一個toJSON函數,該函數會自動被JSON.stringify使用(yourclassobject) https:// stackoverflow .com/questions/29705211/object-define -property-on-a-prototype-preventing-json-stringify-from-serializing-it –

+0

@ N15M0_jk是的,這是真的,但我不想「重寫」JSON的行爲。 stringify',而只是使用'version.toJsonString()' –

+0

或許可以使用自定義的'toJSON()'方法,如[在這裏](https://developer.mozilla.org/en-US/docs/Web/ JavaScript/Reference/Global_Objects/JSON/stringify#toJSON()_ behavior),是嗎? – menehune23

0

我想通過屬性迭代和字符串操縱是危險的。我會做使用對象本身的原型,是這樣的:

public static toJSONString() : string { 
    return JSON.stringify(this, Object.keys(this.constructor.prototype)); // this is version class 
} 
+0

這是工作,但它只是返回setter和getters。我怎樣才能獲得所有不是getter和setter的其他屬性? – hsantos

2

基於@揚AAGAARD解決方案,我已經爲了使用的toJSON方法測試這一項

public toJSON(): string { 
    let obj = Object.assign(this); 
    let keys = Object.keys(this.constructor.prototype); 
    obj.toJSON = undefined; 
    return JSON.stringify(obj, keys); 
} 

+0

這應該是可以接受的答案 – TeodorKolev