2017-12-12 14 views
1

新しいHttpClientの使用に問題があります。HttpClient - Json Arrayのマッピング

Iは、以下のように、reduceを用いてUser[]にユーザJSON配列をマッピングすることができた、前:

export class User { 
    constructor(
     public userId: number, 
     public username: string, 
     public password: string, 
     public isValid: boolean, 
     public type: string, 
     public isValidPassword: boolean) { 
    } 
} 

public loadAllUsers() { 
    return this.http 
     .post('/api/admin/getUsers/', 0) 
     .map((res: any) => { 
      return new User(
       res.userId, 
       res.username, 
       res.password, 
       res.isValid === 'Y' ? true : false, 
       res.type, 
       res.isValidPassword === 'Y' ? true : false 
      ); 
     }) 
     .reduce((x, y) => { x.push(y); return x; }, <any[]>[]); 
} 

を、それが/api/admin/getUsers/応答の一部である:私は

[ 
    { 
    "userId": 1, 
    "username": "Ebraheem Alrabee", 
    "password": "827ccb0eea8a706c4c34a16891f84e7b", 
    "isValid": "Y", 
    "type": "admin", 
    "isValidPassword": "Y" 
    }, 
    { 
    "userId": 4, 
    "username": "Sami", 
    "password": "827ccb0eea8a706c4c34a16891f84e7b", 
    "isValid": "Y", 
    "type": "user", 
    "isValidPassword": "Y" 
    }, ... 
] 

これを試しました:

public loadAllUsers() { 
    return this.http 
     .post<User[]>('/api/admin/getUsers/', 0); 
} 

User[]に直接デシリアライズする代わりにmapを使用してください。isValidのように変更したい値があります。

私は新しいものと同じことをする方法HttpClient、誰も助けることができますか?

+2

ちょっとしたメモとして、 '? true:false''は '==='のように 'true'または' false'を返します。 –

+0

私はリファクタリングする必要がある古いコードです、ノートに感謝します。 –

答えて

1

あなたがそこに.mapを使用することができますように、HTTPサービスへ

export class User{ 
    userId: number; 
    username: string; 
    password: string; 
    isValid: string; 
    type: string; 
    isValidPassword: string; 
    get isValidPasswordBool():boolean { 
     return this.isValidPassword=='Y'; 
    } 
    get isValidBool():boolean { 
     return this.isValid=='Y'; 
    } 
} 

コールになります。また、Userクラスをインタフェースに変更することをお勧めします。

public loadAllUsers(): Observable<User[]> { 
    return this.http 
    .post<any>('/api/admin/getUsers/', 0) 
    .map((res: any) => 
     return <User[]>res.map(item => { 
      item.isValid = item.isValid === 'Y'; 
      item.isValidPassword = item.isValidPassword === 'Y'; 
      return item; 
     }); 
    }); 
} 
+0

まずはお返事ありがとうございます。私はあなたに 'res'が配列であることを伝えたいと思います。私は' isValid'を直接変更することはできません。 –

+0

これは私がまだ修正している古いコードです。 –

+0

@EbraheemAlrabee '運がいい? –

1

loadAllUsers().subscribe(data=> this.userArray= data);を利用するユーザーの構造を変更することなく、あなたのために働くべきである、以下試してみてください、とあなただけovervableもう一方の端を返すこのメソッドとしてユーザー

loadAllUsers(): Observable<User[]> { 
    return this.http.get("apiURL") 
     .map(res => { 
      return res.json().results.map(item => { 
      return new User(
        item.userId, 
       item.username, 
       item.password, 
       item.isValid === 'Y' ? true : false, 
       item.type, 
       item.isValidPassword === 'Y' ? true : false 
      ); 
      }); 
     }); 
    } 

の配列にあなたの関数の戻り値の型を変更する必要があります - doesntの仕事はそれを利用する場合、それは


それを残したりせずに、それはまず第一に動作するかどうか、あなたがしようとしているものか、データを取得するために、あなたがこの

のように行うことができます Get要求でありますの

あなたのユーザークラスは、/変換isValidフラグを変更するために、以下のように

import { Injectable } from '@angular/core'; 
import { Http, Headers, RequestOptions, 
      Response, ResponseContentType } from '@angular/http'; 

GetAllUser(): Observable<Array<User>> { 
    let options = new RequestOptions({ headers: headers }); 
    return this._http.get("/api/admin/getUsers/", 
         options).subscribe(response => response.json()); 
} 
+0

ここに 'Content-Type'ヘッダーを設定する必要はありますか? –

+0

@ serpent5 - 私はコードを読んだ人に明らかにしているので設定します。そして彼は情報を取得します。戻り値の型はjsonになります...そしてレスポンスを提供するのに役立ちます。 –

+0

'Content-Type'は*リクエスト*データではなく、レスポンスデータではありませんか?おそらくあなたは 'Accept'ヘッダを考えているでしょうか?もちろん、何にも影響しません。私は興味があります。 –