如何从json中获取Date对象在typescript中的响应

时间:2016-03-10 13:23:58

标签: 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;
    }

    comment:string;
    datetime:Date;
}

查询:

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

问题是在转换为Job[]之后,我希望datetime属性为Date,但它是字符串。它不应该转换为Date对象吗?我在这里缺少什么?

4 个答案:

答案 0 :(得分:17)

@Gunter是绝对正确的。我想要添加的唯一内容实际上是如何反序列化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示例中的JSON.parse Function

希望这有帮助。

答案 1 :(得分:6)

没有办法知道TS / JS这个值是一个日期。它是一个字符串,并按此处理。其他数据类型是可区​​分的,但JSON没有为日期提供任何特殊支持。您需要手动转换它。

例如,请参阅此讨论,了解如何使用JSON How do I format a Microsoft JSON date?

传输和转换日期

答案 2 :(得分:0)

如果可以使用自定义TypeScript转换器,则可以使用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));

输出:

{ data: [ { comment: '3541', datetime: 2016-01-01T00:00:00.000Z } ] }

答案 3 :(得分:0)

您可以使用2个属性来实现它:一个用于传递日期的字符串属性(例如dateStr)和一个用于在转换后保存数据对象的Date属性(例如dateVal)。

然后在您的构造函数中,您只需执行类似index.html的操作即可。