如何从打字稿中的json响应中获取日期对象

Posted

技术标签:

【中文标题】如何从打字稿中的json响应中获取日期对象【英文标题】:How to get Date object from json Response in typescript 【发布时间】: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 对象吗?我在这里错过了什么?

【问题讨论】:

似乎是***.com/questions/4511705/…的副本 阅读那个,并没有真正回答我关于 TS 的问题 【参考方案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) 之类的操作。

【讨论】:

以上是关于如何从打字稿中的json响应中获取日期对象的主要内容,如果未能解决你的问题,请参考以下文章

如何在反应打字稿中从json文件中获取和显示数据

从打字稿中的 Set-Cookie 标头中获取 jwt 值

使用枚举和泛型在打字稿中获取星期几

从打字稿中的对象获取特定类型的所有键[重复]

如何从打字稿中的数组中获取键[重复]

如何计算打字稿中两个日期之间的时间