Angular 2将JSON转换为具有只读属性的对象

时间:2017-03-10 10:02:51

标签: json angular

我有以下json:

{
    "AssetId": "Asset1",
    "Currency": "USD",
    "Rating": "BBB",
    "Dur": 0.557519237
}

和班级:

export class Constituent {

AssetId?: string;
Currency?: string;
Rating?: string;
Dur?: number;

public get maturityBucket(): string {
    const dur = this.Dur || 0;

    if (dur < 0.5) {
        return '0-6m';
    }
    if (dur < 1) {
        return '6m-1y';
    }
    if (dur < 2) {
        return '1y-2y';
    }
    if (dur < 5) {
        return '2y-5y';
    } else {
        return '5y+';
    }
}

}

然而,当我像这样阅读JSON时:

loadConstituentData(): void {
    const url = './src/data/assets.json';

    this.http.get(url)
        .subscribe(response => {
            this.data.next(<Constituent[]>response.json());
        }, this.handleError);
}

maturityBucket只读属性消失。

我该如何解决这个问题?

以下是代码的Plunker:https://plnkr.co/edit/3oRl9zIlG23jBUvUqaw6?p=preview

1 个答案:

答案 0 :(得分:0)

当您尝试将对象强制转换为特定的类或接口时,您不会更改此对象,您只需告诉Typescript编译器该对象具有特定类型以进行进一步的类型检查。在这种情况下,您确实拥有对象的所有属性,但没有方法(getter属性实际上是方法),所以这样做只会误导编译器和你自己。要使此readonly属性工作,您必须将其添加到对象。

Yo可以通过创建新的Constituent实例并从对象中分配属性来实现所需的行为。例如:

export class Constituent {

  AssetId?: string;
  Currency?: string;
  Rating?: string;
  Dur?: number;

  static createFromJsonObject(jsonObject: any): Constituent {
    let constituent = new Constituent();
    return Object.assign(constituent, jsonObject);
  }
  ...
}

用法是:

this.http.get(url)
        .subscribe(response => {
            this.data.next(response.json().map(item => Constituent.createFromJsonObject(item)));
        }, this.handleError);