我正在制作angular2应用程序,现在我正在尝试将字符串解析为对象。基本上发生的事情是我传回一个字符串,我想把它转换成一个名为IDate的唯一对象。
我得到了这种格式的字符串" 2017-02-27T00:00:00",但我希望它为IDate()。所以到目前为止我所做的是创建一个IDate类,它接受一个字符串并将其转换为日期。我创建了一个Mock类来将响应映射到一个对象。但是,当我打印对象时,我看到值保持字符串。任何人都知道如何实现我所谈论的内容?当我映射来自控制器的响应时,我基本上试图将字符串映射到对象。我可以在像resposne.map(r.time => new Date(r.time));
这样的操作中执行此操作但我宁愿将其映射到响应中,因为我在其他地方调用此控制器,我不想在单独的页面上重复该过程。可以这样做吗?
控制器
return Json(new { Number = 1, Time= "2017-02-27T00:00:00" });
客户
class IDate {
value: Date;
contructor(value) {
this.value = new Date(value);
}
}
class Mock {
number: number;
time: IDate;
}
mock: Mock = null;
this.service.get()
.subscribe(
response => {
console.log("Test response");
this.mock = response;
console.log(this.mock);
},
控制台
Object
number:1
time:"2017-02-27T00:00:00"
__proto__:Object
答案 0 :(得分:0)
我假设您从REST API获取JSON字符串。如果这适用于您的情况,您可以使用reviver
。以下是使用reviver
:
JSON.parse(jsonString, function (key, value) {
if (key === "time")
return new Date(value);
return value;
})
以下是指向跑步小提琴的链接:https://jsfiddle.net/sayan751/Lzb8u638/。
根据OP的comment
进行了更新将通用对象转换为特定类的实例并不是很直接。请注意,this.mock = response;
不会将response
转换为Mock
类的实例(请参阅新的小提琴链接)。
您可以使用Object.assign
,但它可能不适用于类型转换。
另外我认为在您的情况下,JavaScript代码中收到的json对象{Number:number, Time:string}
的架构与Mock
的架构不匹配:{number:number, time:{value:Date}}
。
在这种情况下,最好(根据我的意见)为Mock
编写自定义转换器。一种简单的方法可以如下。有关详细代码,请参阅新的小提琴链接。
class Mock {
number: number;
time: IDate;
public static create(obj):Mock{
let retVal = new Mock();
retVal.number=obj.number;
if(typeof obj.time === "string")
retVal.time = new Date(obj.time); //better to use moment in this case, if possible
else if(obj.time instanceof Date)
retVal.time = obj.time;
return retVal;
}
}
var jsonObj = { number: 1, time: "2017-02-27T00:00:00" };
var obj = Mock.create(jsonObj);
链接到小提琴:https://jsfiddle.net/sayan751/mxoqqc5a/
希望这有帮助。