【问题标题】:Map JSON to TypeScript Class using HttpClient Angular使用 HttpClient Angular 将 JSON 映射到 TypeScript 类
【发布时间】:2018-01-11 04:53:32
【问题描述】:

我想使用 HttpClient 进行 API 调用并将响应映射到类(不是接口),我希望该类具有某些方法,我可以扩展并稍后在 HTML 视图中调用。

我不知道为什么这没有按预期工作,但似乎 HttpClient 无法将我的 json 映射到类。

我得到的错误是: test is not a function

我正在尝试这样做:

用户.ts

export class User {
  id: number;
  first_name: string;
  last_name: string;
  groups: Group[];

  test() {
    return 'test';
  }
}

Api.Service.ts

export class ApiService {

  private base_url: String = environment.api;

  constructor(private http: HttpClient) { }

  public me() {
    return this.http.get<User>(this.base_url + `user/me`);
  }
}

html:

<ng-container *ngIf="user | async; else loading; let user">
    {{user.test()}}
</ng-container>
<ng-template #loading>
    loading...
</ng-template>

控制器:

export class UserController implements OnInit {

    user: Observable<User>;

    constructor(private api: ApiService) {}

    ngOnInit() {
        this.user = this.api.me()
    }
}

【问题讨论】:

标签: javascript json angular typescript


【解决方案1】:

我最终在课堂上定义了这个:

static fromJSON(data: any) {
    return Object.assign(new this, data);
}

这将正确映射值。

【讨论】:

    【解决方案2】:

    你可以做以下我的朋友:

    export class User {
    id: number;
    first_name: string;
    last_name: string;
    groups: Group[];
    
    test() {
      return 'test';
    }
    
    static fromJSON(json) {
        const user: User = new User();
        user.id = json.id;
        user.first_name = json.first_name;
        user.last_name = json.last_name;
        user.groups = [];
    
        json.groups.forEach(group => {
            user.groups.push(Group.fromJSON(group));
        });
    
        return user;
    }
    

    }

    export class ApiService {
    
        private base_url: String = environment.api;
    
        constructor(private http: HttpClient) { }
    
        public me() {
          return this.http.get<User>(this.base_url + `user/me`).map(data => User.fromJSON(data.json()));
        }
    }
    

    您必须将相同的方法“fromJSON”添加到“Group”类中才能从 json.groups 创建一个新的 Group 对象。

    【讨论】:

    • 我正在使用来自 Angular 的新 HttpClient,它不再支持 .json(),此外我正在使用 http.get&lt;User&gt;,因此响应会自动映射到我的类的结构。但问题是 HttpClient 没有创建类(可能是因为 JavaScript 运行时)。
    猜你喜欢
    • 2021-12-04
    • 1970-01-01
    • 2019-11-27
    • 1970-01-01
    • 2017-05-02
    • 1970-01-01
    • 2018-03-21
    • 2016-11-07
    • 1970-01-01
    相关资源
    最近更新 更多