如何将json响应转换为对象,而无需在TypeScript(Angular 6)中进行显式编码?

时间:2018-07-08 07:45:22

标签: json angular api casting

在我的小项目中,部分功能是管理项目实体。我创建了一个看起来像这样的类:

export class IdRef {
  id: number;
}

export class Project {
  id?: number;
  title: string;
  background?: string;
  problemStatement?: string;
  owner: IdRef;
  createdBy: IdRef;
  dateCreated: string;
  updatedBy?: IdRef;
  lastUpdated?: string;

  getDateCreated(): Moment {
    return moment(this.dateCreated);
  }

  getLastUpdated(): Moment {
    if (this.lastUpdated) {
      return moment(this.lastUpdated);
    }

    return undefined;
  }
}

这个想法是当我从API调用中获取项目列表时获得这些对象的列表。

获取列表的服务函数是:

public getProjects(): Observable<Project[]> {
    const projectListUrl = `/v1/api/project`;

    return this.http.get<Project[]>(environment.apiDomain + projectListUrl)
      .pipe(
        catchError(this.networkService.handleError)
      );
  }

我正在这样使用它(在控制器中):

loadProjects() {
    this.projectService.getProjects()
      .subscribe(
        (projects: Project[]) => {
          console.log(`fetched ${projects.length} projects`);
          this.projects = projects as Project[];
        },
        error => this.error = error
      );
  }

我对这一切的期望是,我实际上将获得一个Project对象的列表。但是,控制器中this.projects的值是一个json对象数组,因此,如果不显式构建对象,则无法使用Project的任何功能。

有没有一种方法可以将json“投射” /解析为对象以获得真实的对象? 怎么样?

1 个答案:

答案 0 :(得分:0)

如评论中所述,http.get中的类型转换仅涉及返回对象的形状(即属性),而不涉及方法。

将这些仅属性对象之一转换为所需对象的实际实例以使用Object.assign的最简单方法,如Object.assign(new MyObject(), jsonObject)

例如,

return this.http.get<Project[]>(environment.apiDomain + projectListUrl)
      .pipe(
        map(jsonObj => Object.assign(new Project(), jsonObj),
        catchError(this.networkService.handleError)
      );