Разбор Dynami c Json в карту в Angular - PullRequest
0 голосов
/ 08 апреля 2020

Я использую http-клиент Angular для извлечения данных из API. Я определяю DTO, используя машинописные интерфейсы. Одна из конечных точек возвращает объект json, который имеет динамические c ключи, которые я хотел бы отобразить в Map. Я пробовал разные вещи.

v1

export interface ItemDistribution {
  id: number;
  distribution: Map<string, number>; // I don't know the keys beforehand
}

v2

interface Distribution {
   [key: string]: number;
}

export interface ItemDistribution {
  id: number;
  distribution: Distribution; // I don't know the keys beforehand
}

Но, если я вызываю бэкэнд с http.get<ItemDistribution>(myUrl), результат анализируется в JavaScript объект вместо Я знаю, что могу использовать Object.entries(...) на объекте, но возможно ли получить карту напрямую?

1 Ответ

1 голос
/ 09 апреля 2020

Главное, что нужно понять, это то, что когда вы добавляете тип к вызову Angular HttpClient, например http.get<SomeObject>('http://api/some-end-point'), сопоставление вообще не происходит.

То, что вы получаете, - это объект, который анализируется с JSON. Тот тип, который вы укажете, просто приведен, на самом деле ничего не конвертируется. Если данные в JSON объекте не соответствуют типу, нет ошибок или предупреждений, они просто не соответствуют типу, ожидаемому вашим кодом, и вы, вероятно, получите ошибку времени выполнения.

Это полезно для простых объектов, где свойства ограничены строками и числами и массивами строк, чисел и массивов. Если у вас есть что-то более сложное, например, карта, вам нужно преобразовать это самостоятельно из объекта JSON.

Так что нет, вы не можете получить карту из объекта JSON, возвращенного вашим Вызов HttpClient - вам нужно сделать это с Object.keys() или Object.entries() или чем-то в этом роде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...