【问题标题】:How to get Date object from json Response in typescript如何从打字稿中的json响应中获取日期对象
【发布时间】:2016-06-25 09:00:29
【问题描述】:

这是我的 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[] 之后,我希望datetimeproperty 是Date,但它是字符串。它不应该转换为 Date 对象吗?我在这里错过了什么?

【问题讨论】:

标签: json typescript angular


【解决方案1】:

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

您可以在这里看到这种方法:JSON.parse Function 在 dateReviver 示例中。

希望这会有所帮助。

【讨论】:

  • 在我的例子中,因为我只是接收到一个像2018-12-06T15:32:43.590 这样的字符串,我的函数只是将new Date(value) 分配给一个变量,然后在返回之前检查它的状态。
【解决方案2】:

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

请参阅此讨论如何使用 JSON How do I format a Microsoft JSON date? 传输和转换日期

【讨论】:

  • 这很奇怪,不是吗?如果Job 对象具有datetime 属性为Date 并且我正在转换为Job,这是否意味着我要相应地转换所有属性。
  • 我不太了解 TS,但我认为您不能将字符串转换为日期,而是需要转换它。在运行时,您将其转换为 Job 毫无意义。
【解决方案3】:

如果可以使用自定义 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 } ] }

【讨论】:

    【解决方案4】:

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

    然后在您的构造函数中,您可以简单地执行dateVal = new Date(dateStr) 之类的操作。

    【讨论】:

      猜你喜欢
      • 2018-08-31
      • 1970-01-01
      • 2018-12-12
      • 2013-03-23
      • 2019-05-17
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 2017-04-22
      相关资源
      最近更新 更多