在 TypeScript 中为类定义 JSON 序列化格式的最佳方法是什么?

问题描述 投票:0回答:1

我正在使用 Angular 和 TypeScript 开发一个程序。我有一个名为

class
Signal
,它具有以下属性:

export class Signal {
    id: number;
    obraId: number;
    obra: string;
    descripcion: string;
    rangoInferior: string;
    rangoSuperior: string;
    unidades: string;
    // more properties

    // I use ofJson method to create a Signal object
    static ofJson(signalJson: ISignalJson): Signal {
        return this.createSignal(signalJson.id, signalJson.obraId, signalJson.obra, 
            signalJson.descripcion, signalJson.rangoInferior, signalJson.rangoSuperior,
            signalJson.unidades
        );
    }

    static createSignal(id: number, obraId: number, obra: string,descripcion: string, rangoInferior: string, rangoSuperior: string,
        unidades: string
    ): Signal {
        const new_signal = new Signal();
        new_signal.id = id;
        new_signal.obraId = obraId;
        new_signal.obra = obra;
        new_signal.descripcion = descripcion;
        new_signal.rangoInferior = rangoInferior;
        new_signal.rangoSuperior = rangoSuperior;
        new_signal.unidades = unidades;
        return new_signal;
    }
}

当我从API获取数据时,某些字段(

descripcion
rangoInferior
rangoSuperior
)具有
null
值,我想将它们设置为空字符串。为此,我使用私有属性和 getter/setter。

示例:

private _descripcion: string;
public get descripcion(): string {
    return this._descripcion;
}
public set descripcion(value: string) {
    this._descripcion = value ? value : "";
}

问题在于该对象带有下划线字段,当发送到 API 时将返回错误。

JSON.stringify

我看到了几个解决这个问题的答案:

创建一个
    { "_descripcion": "lll5", "id": 621284, "obra": "INTEGRATION-TESTS", "obraId": 378, "_rangoInferior": '', "_rangoSuperior": '', "_unidades": '' }
  • 方法并删除下划线。
    使用 
  • toJson
  • 如下:
    Object.defineProperties
  • 哪个是最好的解决方案?
  • 还有其他我应该考虑的答案吗?
typescript ecmascript-6
1个回答
0
投票
Object.defineProperties( this, { _descripcion: { writable: true, enumerable: false }, descripcion: { get() { return this._descripcion; }, set(value: string) { this._descripcion = value ? value : ""; }, enumerable: true } } );

将要求您在解析 JSON 时始终将恢复器传递给

toJson()
。必须对此进行记录,以便于维护代码。
请使用 

JSON.parse()

代替。这是一种更详细的方法,但仍然可以让您更好地控制正在发生的事情。除了在

Object.defineProperties()
JSON.stringify()
中使用之外,控制哪些属性可写、哪些属性可枚举的能力还有其他优点。
    

© www.soinside.com 2019 - 2024. All rights reserved.