web-dev-qa-db-fra.com

Comment obtenir un objet Date à partir de json Response en tapuscrit

Voici mon json:

{
  "data": [
    {
      "comment": "3541",
      "datetime": "2016-01-01"
    }
  ]
}

Voici le modèle:

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

    comment:string;
    datetime:Date;
}

Question:

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

Le problème est qu'après la conversion en Job[] je m'attends à ce que datetimeproperty soit Date mais c'est une chaîne. Ne devrait-il pas être converti en objet Date? Qu'est-ce que j'oublie ici?

21
Vladimir Nani

@Gunter est absolument correct. La seule chose que je voudrais ajouter est en fait comment désérialiser l'objet json en gardant ses propriétés de date en tant que dates et non chaînes (à partir du post référencé, ce n'est pas si facile de voir cette approche).

Voici ma tentative:

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;
    }
}

Vous pouvez voir cette approche par exemple ici: JSON.parse Function dans l'exemple dateReviver.

J'espère que cela t'aides.

18
Amid

Il n'y a aucun moyen de savoir pour TS/JS que cette valeur est une date. C'est une chaîne et traitée comme telle. D'autres types de données peuvent être distingués, mais JSON ne fournit aucun support spécial pour la date. Vous devez le convertir manuellement.

Voir par exemple cette discussion sur le transport et la conversion d'une date à l'aide de JSON Comment formater une date Microsoft JSON?

6
Günter Zöchbauer