这是我的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对象吗?我在这里缺少什么?
答案 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
的操作即可。