Angular2。将http响应映射到具体对象实例

时间:2016-09-10 20:54:09

标签: json angular rxjs angular-http

处理http响应的Сommon方法就是这样:

return this._http.get(url)
           .map((res: Response) => res.json());

为您提供Observable<Object[]>,其中Object是从json反序列化动态创建的类型。 然后,您可以在*ngFor="let item of result | async"等...

中使用此结果

我想获得一个特定的类型实例(意味着使用new运算符来调用类型的构造函数)。 尝试了不同的方法来实现这样的目标:

.map((res: Response) => { let obj = res.json(); return new MyObject(obj.id, obj.name);})

但收到此错误:Cannot find a differ supporting object '[object Object]' of type 'object'. NgFor only supports binding to Iterables such as Arrays.

这种方式似乎有效,但它过于复杂,可能无效:

.map((res: Response) => {
    let results = <MyObject[]>[];
    let obj = res.json();
    obj.forEach(
        function (o: any) {
            results.push(new MyObject(o.id, o.name));
        }
    );
    return results;
}

谢谢!

3 个答案:

答案 0 :(得分:2)

如果您知道要从JSON(您可能会这样做)解构的对象类型,则可以创建一个从Object返回实例的静态方法。

class MyClass {

  prop: number;

  static fromObject(src: Object) {
    var obj = new MyClass();
    obj.prop = src.prop;
    return obj;
  }
}

然后将JSON响应转换为MyClass的实例:

Rx.Observable.of('[{"prop":1},{"prop":2},{"prop":3}]')
  .map(val => JSON.parse(val))
  .exhaustMap(val => new Rx.Observable.from(val))
  .map(val => MyClass.fromObject(val))
  .subscribe(
    item => console.log('Next: ', item),
    error => console.log('Error:', error),
    _ => console.log('Completed')
  );

这是如何运作的:

  1. .map(val => JSON.parse(val))只需将响应转换为JSON即对象数组。

  2. .exhaustMap(val => new Rx.Observable.from(val))将每个值转换为Observable,exhaustMap将它们展平,以便JSON中的每个对象都将单独发出。

  3. .map(val => MyClass.fromObject(val))再次使用map将每个对象转换为MyClass的实例。

  4. 查看现场演示:http://jsfiddle.net/f5k9zdh1/1/

答案 1 :(得分:2)

.map((res: Response) => res.json().map(obj => new MyObject(obj.id, obj.name)))

答案 2 :(得分:0)

尝试使用此语法,将其强制转换为对象:

 this.http.post(this.constants.taskUrl + parm, { headers: headers })
            .map((response: Response) => {
                var res = response.json();
                var result = <DataResponseObject>response.json();
                return result;
            })