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;
}
谢谢!
答案 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')
);
这是如何运作的:
.map(val => JSON.parse(val))
只需将响应转换为JSON即对象数组。
.exhaustMap(val => new Rx.Observable.from(val))
将每个值转换为Observable,exhaustMap
将它们展平,以便JSON中的每个对象都将单独发出。
.map(val => MyClass.fromObject(val))
再次使用map
将每个对象转换为MyClass
的实例。
答案 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;
})