Есть ли лучший способ преобразовать это JSON из Java HashMap, проанализированного с GSON, в этот интерфейс TypeScript? - PullRequest
0 голосов
/ 28 апреля 2020

Мой API отвечает следующим кодом JSON:

{
"10240":
{"numberOfYears":2,"totalApplicants":162.5,"firstPriorityApplicants":71.5,"admittants":69.0,"standbyAdmittants":2.5,"quota1Gpa":3.55,"standbyGpa":0.0},
"51200":
{"numberOfYears":2,"totalApplicants":64.5,"firstPriorityApplicants":37.0,"admittants":36.5,"standbyAdmittants":0.0,"quota1Gpa":0.0,"standbyGpa":0.0},
"10242":
{"numberOfYears":2,"totalApplicants":183.0,"firstPriorityApplicants":79.5,"admittants":81.5,"standbyAdmittants":0.0,"quota1Gpa":0.0,"standbyGpa":0.0}, 
... 
}

Мое Angular приложение ожидает массив этого интерфейса:

export interface IAveragedStatistic {
    kotNumber: number;
    statistics: {
        numberOfYears: number;
        totalApplicants: number;
        firstPriorityApplicants: number;
        admittants: number;
        standbyAdmittants: number;
        quota1Gpa: number;
        standbyGpa: number;
    };
}

В моем сервисе я анализирую данные следующим образом:

  public getAveragedStatistics2(): Observable<IAveragedStatistic[]> {
    return this.httpClient.get<IAveragedStatistic[]>('http://localhost:8080/averagedstatistics').pipe(map((data) => {
      return Object.entries(data).map(([key, value]) => {
        let kotNumber: number = +key;
        let statistics: any = value;
        return Object.assign({kotNumber, statistics});
      });
    }));
  }

Но должен быть более умный способ сделать это, верно? Что это?

Я специально исключил обработку ошибок.

1 Ответ

0 голосов
/ 28 апреля 2020

То, как вы это сделали, довольно стандартно. Вам необходимо сопоставить объект с массивом. Если вы хотите «умный» способ, вы можете попробовать следующее (все еще без внешних библиотек), используя сокращенные свойства и переименовывая непосредственно аргументы:

return Object.entries(data)
  .map(([kotNumber, statistics]) => ({
    kotNumber: +kotNumber,
    statistics
  }));
...