Angular 8 способ преобразовать json ответ со строковыми датами в JS дату? - PullRequest
0 голосов
/ 10 июля 2020

Я знаю, что json не обрабатывает даты особым образом и предоставляет их как строки с сервера. Есть ли способ предоставить ответ объекта json, имеющий свойство даты ISO, и сопоставить его с классом, уже имеющим свойство даты, сопоставленное как дата JS?

Пример:

Json Ответ:

{
    "data": {
        "id": 1,
        "name": "John",
        "surname": "Smith",
        "birthDate": "1986-05-04T22:59:59.000Z"
        "subscriptionDate": "2020-06-28T14:36:43.498Z"
    }
}

И у меня есть этот класс:

export class User {

    id: string;
    name: string;
    surname: string;
    birthDate: Date;
    subscriptionDate: Date;

}

Мой метод обслуживания:

getUser(id: string): Observable<User> {
    return this.http.get<User>(`${this.UrlService}estabelecimentos/${id}`, { headers: this.authenticationService.jwt() }).catch(super.serviceError);
}

Но когда я использую его в своем Компоненты BirthDate и subscriptionDate всегда обрабатываются как строки. Есть ли способ преобразовать его в JS дат без необходимости форматировать дату в каждом запросе, повторяя ответ json и изменяя объект?

Ответы [ 3 ]

1 голос
/ 10 июля 2020

Короткий ответ - нет, поскольку формат JSON не допускает типов даты. См. Это: https://www.w3schools.com/JS/js_json_datatypes.asp

Я не думаю, что у вас есть другой выбор, кроме как преобразовать их в объекты Date, и, кроме того, это относительно тривиально, учитывая ваш строковый формат даты:

ndate = new Date("1986-05-04T22:59:59.000Z")
0 голосов
/ 10 июля 2020

Поскольку GET вернет наблюдаемое, вы должны иметь возможность сделать что-то вроде этого:

getUser(id: string): Observable<User> {
  return this.http.get<User>(`${this.UrlService}estabelecimentos/${id}`, { headers: this.authenticationService.jwt() })pipe(
    map(response => {
      return {
        "data": {
          "id": response.id,
          "name": response.name,
          "surname": response.surname,
          "birthDate": new Date(response.birthDate)
          "subscriptionDate": new Date(response.subscriptionDate)
      }
    }),
    catchError(()=> super.serviceError)
  )
}
0 голосов
/ 10 июля 2020

JSON не поддерживает дату. Вам нужно преобразовать его вручную. Как показано ниже:

new Date("1986-05-04T22:59:59.000Z");

Преобразование объекта JSON в объект Javascript может помочь вам достичь того, что вам нужно.

Проверьте эту функцию:

function convertJsonIntoJavaScript(data){
let newObj = new Object();
   Object.keys(data).forEach(x=> {
   let d = new Date(data[x]);
   newObj[x]= (d instanceof Date && !isNaN(d))? d: data[x];
});
return newObj;
}

ПРИМЕЧАНИЕ: Я не тестировал эту функцию, напишите свой отзыв в комментарии ниже, если она работает или нет.

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