如何从typescript中的json响应中获取日期对象

如何从typescript中的json响应中获取日期对象,json,typescript,angular,Json,Typescript,Angular,这是我的json: { "data": [ { "comment": "3541", "datetime": "2016-01-01" } ] } 以下是模型: export class Job { constructor(comment:string, datetime:Date) { this.comment = comment; this.datetime = datetime; }

这是我的json:

{
  "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;
}
查询:

getJobs() {
        return this._http.get(jobsUrl)
            .map((response:Response) => <Job[]>response.json().data)
}
getJobs(){
返回此。\u http.get(jobsUrl)
.map((response:response)=>response.json().data)
}

问题是,在转换到
Job[]
之后,我希望
datetime
属性是
Date
,但它是字符串。它不应该投射到日期对象吗?我在这里遗漏了什么?

对于TS/JS,无法知道该值是日期。它是一个字符串,被当作字符串处理。其他数据类型是可以区分的,但JSON不提供对日期的任何特殊支持。您需要手动转换它


例如,请参见本讨论,如何使用JSON传输和转换日期是绝对正确的。我唯一想补充的是如何反序列化json对象,使其日期属性保持为日期而不是字符串(从引用的文章中可以看出,这种方法并不容易)

以下是我的尝试:

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;
    }
}
例如,您可以在这里看到这种方法:在dateReviver示例中


希望这有帮助。

如果可以使用自定义的TypeScript转换器,可以使用:

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

您可以使用两个属性来实现它:一个字符串属性(比如dateStr)用于传递日期,另一个日期属性(比如dateVal)用于保存转换后的数据对象


然后在你的构造函数中,你可以简单地做一些事情,比如
dateVal=newdate(dateStr)

看起来像是一个重复,读了那个,并没有真正回答我关于TST的问题,这很奇怪,不是吗?如果
Job
对象的
datetime
属性为
Date
,并且我正在转换为Job,这是否意味着我要相应地转换所有属性。我不太清楚这一点,但我认为您不能将字符串转换为日期,您需要转换它。在运行时,您强制转换到
作业
是毫无意义的。在我的例子中,因为我只是接收一个字符串,如
2018-12-06T15:32:43.590
,我的函数只是将
新日期(值)
分配给一个变量,然后在返回之前检查其状态。