如何将json响应对象动态映射到实体?

时间:2017-08-01 21:47:49

标签: javascript angular typescript

我正在实现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中这样做的好方法是什么?

4 个答案:

答案 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()
}