我正在实现ng2,其中我的user.service.ts调用REST服务并返回json,如下所示:
getUser(id: number): Promise<User> {
return this.http.get('http://localhost:4000/users/1')
.toPromise()
.then(response => response.json())
}
返回的对象如下所示:
{
"Id":"1"
"FirstName":"John"
"LastName":"Smith"
}
我需要将其转换为我的ng2用户实体,如下所示:
export class User
{
Id: number;
FirstName: string;
LastName: string;
}
我想以最通用的方式执行此操作,我可以将其用作模式。例如,像:
var user = userResponse.map(User);
我希望使用反射或类似的动态技术,因此映射会自动发生,无需任何额外的显式编码。在ng2中这样做的好方法是什么?
答案 0 :(得分:2)
基于评论,似乎你想避免在你的班级中使用构造函数。嗯,最简单的&#34;这里的解决方案是使用Object.assign()
:
getUser(id: number): Promise<User> {
return this.http.get('http://localhost:4000/users/1')
.map(res => Object.assign(new User(), res.json()))
.toPromise()
}
现在您的数据是User
的实例。
演示:http://plnkr.co/edit/Gzi6tjZzTizDhlMCD1y9?p=preview(检查控制台)
答案 1 :(得分:0)
当你声明你的类时,你可以添加一个构造函数来正确构建类:
export class User
{
Id: number;
FirstName: string;
LastName: string;
constructor(obj: any) {
this.Id = +obj['Id'];
this.FirstName = obj['FirstName'];
this.LastName = obj['LastName'];
}
}
查看this plunker以查看其实际效果。
要动态设置和重置,您可以创建一个方法:
let user = setUser(this.userResponse); // <-- Assuming this.userResponse is the returned object
setUser(res) {
return {
Id: +res['Id'],
FirstName: res['FirstName'],
LastName: res['LastName']
};
}
答案 2 :(得分:0)
从json对象获取属性键,然后遍历它们并按名称将它们分配给对象的属性。
class CrazyProxyClass
def [](v)
Class.new
end
end
CrazyMethod = CrazyProxyClass.new
class CrazyDerived < CrazyMethod[1.2]
end
CrazyDerived.new
# => CrazyDerived
或者像您要求的那样可重复使用的功能:
class NormalBase
end
class DebugBase < NormalBase
end
class Example < (ENV['DEBUG'] ? DebugBase : NormalBase)
end
我以前从未写过TypeScript,所以我在这里给出了最好的猜测。希望这足以让你开始。
答案 3 :(得分:0)
在我的项目中,我使用Observable而不是Promise,我的代码就像
getUser(id: number): Observable<User> {
return this.http.get('http://localhost:4000/users/1')
.map(resp=>resp.json());
}
如果需要承诺
getUser(id: number): Promise<User> {
return this.http.get('http://localhost:4000/users/1')
.map(resp=>resp.json())
.toPromise()
}