Angular2 l'analyse de JSON pour objet

J'essaie de trouver la meilleure façon d'exprimer mon objet json à Tapuscrit de l'objet.
J'ai un http get service qui renvoie une liste d'utilisateur.
Ma version actuelle fonctionne, j'ai ajouté de JSON à toutes mes classes de modèle pour faire de la cartographie des travaux:

export class User {

    constructor(
        public pk: number,
        public username: string,
        public first_name: string,
        public last_name: string,
        public email: string,
        public profile: UserProfile, ) {
    }

    static fromJSON(json: any): User {
        let user = Object.create(User.prototype);
        Object.assign(user, json);
        user.profile = UserProfile.fromJSON(json.profile);
        return user;
    }
}

Qui fonctionne bien. Mais il y a quelque chose que je ne comprends pas dans l'angle de 2 doc. Sur les héros tutoriel, le JSON est automatiquement intégré à l'objet de cette façon:

  getHeroes (): Observable<Hero[]> {
    return this.http.get(this.heroesUrl)
                    .map(this.extractData)
                    .catch(this.handleError);
  }
  private extractData(res: Response) {
    let body = res.json();
    return body.data || { };
  }

Je ne peux pas obtenir cette méthode pour travailler sur mon cas, j'ai dit que body.data est pas défini.
Cette méthode fonctionne vraiment?

EDIT:

Mon service http n'est pas retourne un tableau d'utilisateurs. Il renvoie une page qui contient un tableau des utilisateurs dans ses "résultats" de la propriété.

{
  "count": 2,
  "next": null,
  "previous": null,
  "results": [
    {
      "pk": 48,
      "first_name": "Jon",
      "last_name": "Does",
      "profile": {
        "pk": 46,
        "gender": "U"
      }
    },
    {
      "pk": 47,
      "first_name": "Pablo",
      "last_name": "Escobar",
      "profile": {
        "pk": 45,
        "gender": "M"
      }
    }
  ]
}

Mon code de service:

 private extractData(res: Response) {
    let body = res.json().results;
    return body || {}; //<--- not wrapped with data
  }

  search(authUser: AuthUser, terms: string): Observable<User[]> {
    let headers = new Headers({
      'Content-Type': 'application/json',
      'X-CSRFToken': this.cookiesService.csrftoken,
      'Authorization': `Token ${authUser.token}`
    });
    let options = new RequestOptions({ headers: headers });
    return this.http.get(environment.server_url + 'user/?search=' + terms, options)
      .map(this.extractData);
    //.map((response: Response) => response.json());
  }

Mon composant de la recherche de code:

 onSearch(terms: string) {    
    this.searchService.search(this.user, terms).subscribe(
      response => {       
          console.log(response); //Return array of object instead of array of user
      },
      error => {
          console.log(JSON.stringify(error));
      },
      () => { }
    );
 }

EDIT 2:

À faire à ce cas plus facile, j'ai écrit ce code simple:

  test(){
    let json_text=` [
      {
        "id": 1,
        "text": "Jon Doe"
      },
      {
        "id": 1,
        "text": "Pablo Escobar"
      }
    ]`;

    console.log(<MyObject[]>JSON.parse(json_text)); //Array of objects
    console.log(MyObject.fromJSON(JSON.parse(json_text))); //Array of 'MyObject'
  }



export class MyObject{
  id: number;
  text: string;

   static fromJSON(json: any): MyObject {
        let object = Object.create(MyObject.prototype);
        Object.assign(object, json);
        return object;
    }
}
  • console.log(<MyObject[]>JSON.parse(json_text)) renvoie une liste d'Objets
  • console.log(MyObject.fromJSON(JSON.parse(json_text))) renvoie une
    liste de MyObject

OriginalL'auteur Ben | 2016-10-16