Porównaj ceny domen i usług IT, sprzedawców z całego świata

Jak pobrać obiekt daty z odpowiedzi json w skrypcie


Oto mój plik json:
{
"data": [
{
"comment": "3541",
"datetime": "2016-01-01"
}
]
}

Oto model:
export class Job {
constructor(comment:string, datetime:Date) {
this.comment = comment;
this.datetime = datetime;
} comment:string;
datetime:Date;
}

Zapytanie ofertowe:
getJobs() {
return this._http.get(jobsUrl)
.map((response:Response) => <Job[]>response.json().data)
}

Problem polega na tym, że po przesłaniu do
Job []
oczekuję, że właściwość
datetime
będzie miała wartość
Date
, ale jest to ciąg. Czy nie powinno to skutkować obiektem daty? Czego tu brakuje?
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

@Gunter ma całkowitą rację. Jedyne, co chciałbym dodać, to jak faktycznie deserializować obiekt json, przechowując jego właściwości daty jako daty, a nie ciągi (z wspomnianego postu nie jest łatwo zobaczyć takie podejście).
Oto moja próba:
export class Helper
{
public static Deserialize(data: string): any
{
return JSON.parse(data, Helper.ReviveDateTime);
} private static ReviveDateTime(key: any, value: any): any
{
if (typeof value === 'string')
{
let a =/\/Date\((\d*)\)\//.exec(value);
if (a)
{
return new Date(+a[1]);
}
} return value;
}
}

Możesz zobaczyć to podejście, na przykład tutaj:

funkcjonować
https://msdn.microsoft.com/library/cc836466(v=vs.94).aspx
JSON.parse w przykładzie dateReviver.
Mam nadzieję że to pomoże.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

TS/JS nie ma możliwości dowiedzenia się, że ta wartość jest datą. Jest to ciąg i jako taki jest traktowany. Pozostałe typy danych można rozróżnić, ale JSON nie zapewnia żadnej specjalnej obsługi dat. Musisz go przekonwertować ręcznie.
Zobacz na przykład tę dyskusję na temat transportu i konwertowania daty przy użyciu formatu JSON

Jak sformatować datę Microsoft JSON?
https://coderoad.ru/206384/
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jeśli możliwe jest użycie niestandardowego transformatora TypeScript,

następnie
https://www.npmjs.com/package/ts-transformer-dates
możesz użyć dat ts-transformer-dates:
import { toDates } from 'ts-transformer-dates';const value = {
"data": [
{
"comment": "3541",
"datetime": "2016-01-01"
}
]
};export class Job {
constructor(comment:string, datetime:Date) {
this.comment = comment;
this.datetime = datetime;
} comment:string;
datetime:Date;
}console.log(toDates<{data:Job[]}>(value));

Wyjście:
<pre class="lang-js prettyprint-override">
{ data: [ { comment: '3541', datetime: 2016-01-01T00:00:00.000Z } ] }
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz to osiągnąć za pomocą 2 właściwości: właściwości ciągu (powiedzmy dateStr) do przekazania daty i właściwości daty (powiedzmy dateVal) do przechowywania obiektu danych po konwersji.
Następnie w swoim konstruktorze możesz po prostu zrobić coś takiego jak
dateVal = new Date (dateStr)
.

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się