我想将json字符串数组转换为对象数组。 在这种情况下,我有一个从后端接收的字符串
[{"id_pk":3,"heroname":"myherooo"},{"id_pk":12,"heroname":"Narco"}]
我希望将此字符串转换为Hero数组,然后将其返回。
我目前的代码:
getHeroes(): Promise<Hero[]> {
return this.http.get(this.heroesUrl)
.toPromise()
.then(response => {
console.log(response);
let heroes: Hero[];
let jo = response.text(); // [{"id_pk":3,"heroname":"myherooo"},{"id_pk":12,"heroname":"Narco"}]
console.log("jo: "+jo);
for(let i=0;i<jo.length;i++){
console.log("ele: "+JSON.parse(response.text()[i])); // SyntaxError: Unexpected end of JSON input
heroes[i] = JSON.parse(response.text()[i]);
}
heroes;
})
.catch(this.handleError);
}
有人可以帮忙吗?
更新
这是解决方案:
getHeroes(): Promise<Hero[]> {
return this.http.get(this.heroesUrl)
.map (t=>t.json())
.toPromise()
.then(response => response.map(i => new Hero(i.id_pk, i.heroname)))
.catch(this.handleError);
}
答案 0 :(得分:2)
使用return this.http.get(this.heroesUrl)
.map (t=>t.json())
.toPromise()
...
:
Failed to load resource: the server responded with a status of 405 (Not Allowed)
/?wc-ajax=update_order_review
Failed to load resource: the server responded with a status of 405 (Not Allowed)/?wc-ajax=get_refreshed_fragments
答案 1 :(得分:1)
您的问题是您在解析JSON之前尝试循环访问数组:
heroes[i] = JSON.parse(response.text()[i]);
//And then in
heroes[i] = JSON.parse(response.text()[i]);
您应该在访问数组之前解析JSON并对其元素进行循环:
let jo = JSON.parse(response.text());
console.log("jo: "+jo);
for(let i=0;i<jo.length;i++){
console.log("ele: "+jo[i]);
heroes[i] = jo[i];
}
答案 2 :(得分:1)
在Hero类中创建一个构造函数。应该看起来像:
export class Hero {
id: number;
name: string;
constructor(hero?: any) {
if (hero) {
this.id = hero.id;
this.name = hero.name;
}
}
}
现在您需要映射数据。我将举例说明我将如何做到这一点:
this.heroService.getHeroes().subscribe(
response => this.heroes = response.map(h => new Hero(h)),
error => console.log(error)
);
编辑:
顺便说一下,在我发布这个答案后,我用Google搜索了你的问题,我立即找到了解决方案here。您可以在页面上查找.map并获取更多示例。
this.results = res.json().results.map(item => {
return new SearchItem(
item.trackName,
item.artistName,
item.trackViewUrl,
item.artworkUrl30,
item.artistId
);
});
答案 3 :(得分:0)
试试这个:
getHeroes(): Promise<Hero[]> {
return this.http.get(this.heroesUrl)
.toPromise()
.then(res => <Hero[]>res.json());
}