Dom*_*nic 12 json getter-setter typescript
我在TypeScript中使用getter/setter访问器.由于变量和方法不可能具有相同的名称,因此我开始使用较低的短划线为变量添加前缀,如许多示例所示:
private _major: number;
get major(): number {
return this._major;
}
set major(major: number) {
this._major = major;
}
Run Code Online (Sandbox Code Playgroud)
现在,当我使用JSON.stringify()方法将对象转换为JSON字符串时,它将使用变量名作为键:_major.
由于我不希望JSON文件的所有键都以下划线作为前缀,因此有可能使TypeScript使用getter方法的名称(如果可用)吗?或者是否有其他方法可以使用getter/setter方法,但仍然可以生成干净的JSON输出?
我知道有些方法可以在将JSON密钥写入字符串输出之前手动修改它们.如果有更简单的解决方案,我很好奇.
这是一个JSFiddle,它演示了当前的行为.
基于@ Jan-Aagaard解决方案,我测试了这个
public toJSON(): string {
let obj = Object.assign(this);
let keys = Object.keys(this.constructor.prototype);
obj.toJSON = undefined;
return JSON.stringify(obj, keys);
}
Run Code Online (Sandbox Code Playgroud)
为了使用toJSON方法
不,您不能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}
Run Code Online (Sandbox Code Playgroud)
我认为迭代属性和字符串操作是危险的。我会使用对象本身的原型,如下所示:
public static toJSONString() : string {
return JSON.stringify(this, Object.keys(this.constructor.prototype)); // this is version class
}
Run Code Online (Sandbox Code Playgroud)