0
現在、私はajax呼び出しから得たjsonに基づいてオブジェクトを作成しようとしています。オブジェクトを作成するクラスを動的に選択
{
"users": [
{
"address": {
"city": "testCity",
"houseNumber": 69,
"id": 1,
"postcode": 420,
"street": "testStreet"
},
"email": "[email protected]",
"gender": "male",
"id": 3,
"isAdmin": false,
"lastname": "testLastname",
"prename": "testPrename",
"projects": [
{
"archived": null,
"files": [],
"id": 1,
"name": "testProject",
"timestamp": "2017-01-27T20:23:06+00:00",
"uri": "http://localhost:2000/api/projects/1"
}
],
"uri": "http://localhost:2000/api/users/3"
}
]
}
私は、その入力からUser型のオブジェクトを作成するために、Userクラス内に静的メソッドを定義しました。私が探しているのは、クラスProjectおよびAddressのオブジェクトを作成し、それらをユーザークラス内の対応するフィールドに設定する方法です。
export class User {
public uri: string = undefined;
public id: number = undefined;
public readonly isAdmin: boolean = undefined;
public prename: string = undefined;
public lastname: string = undefined;
public gender: string = undefined;
public email: string = undefined;
private password: string = undefined;
public address: Address = undefined;
public projects: Project[] = undefined;
constructor() {
}
// Returns an array containing one or more User objects
public static load(res: Response): User[]{
let data: Object = res.json();
let users: User[] = [];
// Payload contains multiple Users (array)
if(data.hasOwnProperty('users')){
let dataUsers: Object[] = data['users'];
for(let dataUser of dataUsers){
let user = new User();
for(let key in user){
if(dataUser.hasOwnProperty(key)){
if(typeof dataUser[key] === 'object'){
// If it's an object, find the class that matches the 'content' of the object and call their load method
}
} else {
user[key] = dataUser[key];
}
}
}
users.push(user);
}
// Payload contains a single User
} else if(data.hasOwnProperty('user')){
let dataUser = data['user'];
let user = new User();
for(let key in user){
if(data.hasOwnProperty(key)){
user[key] = dataUser[key];
}
}
users.push(user);
} else {
users.push(new User());
}
return users;
}
一つの方法は、キーが「プロジェクト」または「アドレス」であるかどうかをチェックすることにより、住所やプロジェクトのためのオブジェクトの作成をハードコーディングすることができますが、私はより多くの「ダイナミック」を探しています:これは私が現在持っているものですそれを点にする方法。
感謝回答!前述のロード機能は、すべてのモデル(ユーザ、住所、プロジェクト...)で実装されています。したがって、私はコンストラクタを呼び出すことによってオブジェクトを作成するのではなく、対応するクラスの静的ロード関数を呼び出すことによって(複数のインスタンスを作成する必要がある場合に備えて)作成します。 – Lelsoos
@Lelsoosはその情報で答えを更新しました – Paarth
それは私に型エラーをもたらします:keyClassMap [key]は関数ではありません – Lelsoos