当响应在Json数组中返回多于1个对象时,下面的代码工作正常。注意,期望的Json结构是属性字段" address"引用的Address对象数组。换句话说,(addresses.address)下面引用一个数组。
public getAddressByPersonName(personName: string): Observable<Address[]> {
return this.http
.get(API_URL)
.map(response => {
const addresses = response.json();
if (addresses)
return (addresses.address).map((address) => new Address(address));
return null;
})
.catch(this.handleError);
}
当只找到一个地址时,响应返回带有单个Address对象的Json。但是我在运行时遇到错误。
TypeError:addresses.address.map不是函数
返回的JSON字符串是:
{
"address": {
"addressId": "1",
"addressLine1": "5 Bayberry Close",
"personName": "Dr John",
"route": {
"routeId": "100",
"routeName": "45 Main Street",
"updateBy": "admin",
"updateDate": "2017-07-03T17:48:33-04:00"
},
"updateBy": "admin",
"updateDate": "2017-07-03T18:10:27-04:00"
}
}
上述运行时错误的原因是什么?
答案 0 :(得分:1)
如果我理解正确您正在尝试映射对象,但map function仅适用于数组
你可以做的是检查给定的响应是否是预期的数组响应,并将对象包装在一个数组内,以防它已经是一个。
如下:
getAddressByPersonName() {
return this.http.get(API_URL)
.map(response => {
const addresses = response.json();
if (addresses) {
if(!Array.isArray(addresses.address)) {
addresses.address = [addresses.address]
}
return (addresses.address).map((address: Address) => new Address(address));
}
return null;
})
}
答案 1 :(得分:1)
正如我们所看到的,如果它只返回一个对象,那么你获得的JSON实际上是一个对象而不是一个数组,我们不能在一个Object上使用map
。由于它适用于多个对象,我假设你的JSON响应然后返回一个带有数组的对象address
:
{
"address": [{ ... }, { ... }]
}
所以我们可以做的是检查响应是否确实是一个数组,如果是,那么做映射。如果没有,那么只需将响应转换为与您的类匹配的对象。为了保持一致性,我认为你想要返回数组中的单个对象(?)以避免类型不匹配,所以做这样的事情:
getAddressByPersonName() {
return this.http.get(API_URL)
.map(response => {
const addresses = response.json();
if (addresses) {
if(Array.isArray(addresses.address)) {
return
(addresses.address).map((address: Address) => new Address(address));
} else {
return [new Address(addresses.address)]
}
}
return null;
})
}