Отображение ответа http на объект typeScript - PullRequest
1 голос
/ 24 апреля 2020

Я пытаюсь преобразовать ответ API (json строковый массив) в объект машинописного текста, но не могу достичь. Я пытался добавить функцию карты, но не смог правильно ее использовать.

Пример ответа API: ["Paris", "London", "New York"] *

мой класс City такой

export class City { Name:string; 
                    isAvailable: boolean;
                  }

Моя функция

public getCities(queryId: string) : Observable<City[]> {
              const url = apiUrl;

              const response = this.http.get<string[]>(url)
                                   .pipe(catchError(this.handleError));
             //how can i add map method here to convert String to City object?

              return response;

         }

Я ожидаю, что вывод будет

[
  {Name:"Paris",isAvailable:true},
  {Name:"London",isAvailable:true}, 
  {Name:"New York",isAvailable:true}
]

Ответы [ 2 ]

2 голосов
/ 24 апреля 2020

Если вы хотите sh обработать это в вашем конвейере Rx JS, это то, что вы можете сделать. Мы используем оператор Rx JS map для преобразования ответа в массив City объектов.

public getCities(queryId: string) : Observable<City[]> {
  const url = apiUrl;

  return this.http.get<string[]>(url)                                
    .pipe(
      map((res) = {
        return res.map(name => ({
          Name: name,
          isAvailable: true,
        });
      }),
      catchError(this.handleError));   
}
2 голосов
/ 24 апреля 2020

Во-первых, вам понадобится способ поместить эти значения в ваш класс. Давайте просто примем их в конструкторе.

export class City {
  Name: string; 
  isAvailable: boolean;

  constructor(name: string, isAvailable: boolean) {
    this.Name = name
    this.isAvailable = isAvailable
  }
}

Теперь, предполагая, что response является вашей JSON строкой, затем сначала вы хотите проанализировать строку JSON и привести ее к формату, который вы ожидаете ( string[]).

Затем сопоставьте его, чтобы создать то, что вам нужно.

const cities: string[] = JSON.parse(response)
const cityObjects = cities.map(name => new City(name, true))
...