将json字符串转换为角度cli中的对象数组

时间:2017-10-17 08:26:47

标签: arrays json angular

我想将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);
   }

4 个答案:

答案 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());
}