Aquí está mi json:
{ "data": [ { "comment": "3541", "datetime": "2016-01-01" } ] }Aquí está el modelo:
export class Job { constructor(comment:string, datetime:Date) { this.comment = comment; this.datetime = datetime; } comment:string; datetime:Date; }Consulta:
getJobs() { return this._http.get(jobsUrl) .map((response:Response) => <Job[]>response.json().data) } El problema es que después de enviar a Job[] , espero que la propiedad de fecha y datetime sea Date , pero es una cadena. ¿No debería lanzarse al objeto Fecha? que me estoy perdiendo aqui?
@Gunter es absolutamente correcto. Lo único que me gustaría agregar es cómo deserializar el objeto json manteniendo sus propiedades de fecha como fechas y no como cadenas (de la publicación a la que se hace referencia no es tan fácil ver este enfoque).
Aquí está mi intento:
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; } }Puede ver este enfoque, por ejemplo, aquí: Función JSON.parse en el ejemplo de dateReviver.
Espero que esto ayude.
No hay forma de saber para TS/JS que este valor es una fecha. Es una cadena y se trata como tal. Se pueden distinguir otros tipos de datos, pero JSON no proporciona ningún soporte especial para la fecha. Necesitas convertirlo manualmente.
Consulte, por ejemplo, esta discusión sobre cómo transportar y convertir una fecha usando JSON . ¿Cómo formateo una fecha de Microsoft JSON?
Si es posible el uso de un transformador TypeScript personalizado, se podrían usar 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));Producción:
{ data: [ { comment: '3541', datetime: 2016-01-01T00:00:00.000Z } ] }