json - Angular 9 将 json 响应映射到数组

标签 json angular mapping response angular-arrays

我有这个界面

export interface Student {
    cf: string,
    firstName: string,
    lastName: string,
    dateOfBirth: Date,
    description?: string,
    enrollmentDate?: Date
}

我想使用 http get 请求填充学生数组,该请求为每个学生返回以下 json

{cf: "blablabla", first_name: "Mario", last_name: "Rossi", date_of_birth: "1998-01-24", enrollment_date: "2019-03-20" },

如您所见,界面的名称与响应不同(firstName 而不是 first_name),因此当我将学生的姓名打印到控制台时,我得到未定义

这是我从中获取数据的服务函数

  getStudents(): Observable<Student[]> {
    return this.httpClient.get<Student[]>(this.studentsUrl, this.baseService.httpOptions);
  }

这是我的学生组件

export class StudentsComponent implements OnInit {

  students: Student[];
  childIcon = faChild;
  plusIcon = faPlus;
  private _newStudent: boolean = false;

  constructor(private studentsService: StudentsService) { }

  ngOnInit(): void {
    this.studentsService.getStudents().subscribe(
      (result: Student[]) => {
        this.students = result;
        this.students.forEach(student => console.log(student));
      },
      error => console.log(error)
    )
  }
}

有没有办法将 json 响应转换为我的学生界面?关于堆栈溢出的几个答案表明 ma​​p 是一种方法,但我不明白如何将该运算符与 subscribe

一起使用

最佳答案

一种方法是手动循环数组并定义新键并删除过时的键,然后使用 RxJS map 返回数组。

服务

import { pipe } from 'rxjs';
import { map } from 'rxjs/operators';

getStudents(): Observable<Student[]> {
  return this.httpClient.get<Student[]>(this.studentsUrl, this.baseService.httpOptions).pipe(
    map(response => response.forEach(student => {
        student.firstName = student.first_name;
        student.lastName = student.last_name;
        student.dateOfBirth = student.date_of_birth;
        student.enrollmentDate = student.enrollment_date;
        delete student.first_name;
        delete student.last_name;
        delete student.date_of_birth;
        delete student.enrollment_date;
      });
    )
  );
}

但是,根据数组中元素的数量,对于单个 HTTP 请求来说,这可能是一项繁重的操作。您无法定义接口(interface)定义来匹配 API 定义吗?

关于json - Angular 9 将 json 响应映射到数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61558581/

相关文章:

javascript - 使用 Angular 4 作为现有 Web 应用程序的一部分

vim - 如何在 vim 中重新映射 ctrl-shift-left 鼠标?

android - 第二个AlertDialog列表项点击基于第一个Alertdialog列表android

json - 将键值数组存储到紧凑的JSON字符串中

wcf - 替换WCF默认JSON序列化

c# - WCF:设置了FaultContract,但未导致REST 服务中捕获FaultException<T>

javascript - 在 AngularJS 中更新 JSON 文件

angular - ng2-smart-table 派生列

javascript - 在 Ionic 3、Firebase 和 Angular 中迭代项目列表并将其显示在页面上时出现错误

c# - 如何告诉 Automapper 检查所有源属性是否都有目标属性