2016-03-10 9 views
15

Oto moja json:Jak uzyskać obiekt Date od json odpowiedzi w maszynopisie

{ 
    "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:

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

Problem jest to, że po odlewaniu do Job[] oczekuję, że datetime właściwość będzie Date, ale jest ciąg. Czy nie powinien być rzutowany na obiekt Date? Czego tu mi brakuje?

+1

Wydaje się być dupą http://stackoverflow.com/questions/4511705/how-to-parse-json-to-receive-a-date-object-in-javascript –

+1

Przeczytaj to, nie robi naprawdę odpowiedzi moje pytanie o TS –

Odpowiedz

15

@Gunter jest absolutnie poprawne. Jedyne, co chciałbym dodać, to w rzeczywistości deserializować obiekt json, zachowując jego właściwości daty jako daty, a nie ciągi (z przywołanego postu nie jest tak łatwo zauważyć 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; 
    } 
} 

Widać to podejście na przykład tutaj: JSON.parse Function w przykładzie dateReviver.

Mam nadzieję, że to pomoże.

4

Nie można ustalić TS/JS, że ta wartość jest datą. Jest ciągiem i traktowany jako taki. Inne typy danych są rozróżnialne, ale JSON nie zapewnia żadnej specjalnej obsługi daty. Musisz przekonwertować go ręcznie.

Patrz na przykład ta dyskusja jak transport i przekonwertować datę za pomocą JSON How do I format a Microsoft JSON date?

+1

To dziwne, prawda? jeśli obiekt '' Job'' ma właściwość '' datetime'' jako '' Date'' i im casting do zadania, nie oznacza to, że chcę odpowiednio rzutować wszystkie właściwości. –

+0

Nie znam TS zbyt dobrze, ale nie sądzę, że można rzucić ciąg na datę, trzeba go przekonwertować zamiast tego. W czasie wykonywania nie ma znaczenia, że ​​w ogóle rzucisz na 'Job'. –

Powiązane problemy