web-dev-qa-db-fra.com

Classe JSON à Javascript

J'ai une requête http qui obtient cet objet Json d'une base de données nosql:

let jsonBody = {
    birthday : 1997,
    firstname: 'foo',
    lastname:'bar'
}

Ensuite, je veux charger ces informations dans le modèle étudiant:

class Student{
    constructor(){

    }

    getFullname(){
        return this.lastname+' '+this.firstname
    }
    getApproxAge(){
        return 2018- this.birthday
    }
}

Normalement, j'ajouterais cette méthode à cette classe:

fromJson(json){
    this.studentId = json.studentId;
    this.birthday = json.birthday;
    this.firstname = json.firstname;
    this.lastname = json.lastname;
}

Je l'utiliserais comme suit:

let student = new Student()
student.fromJson(jsonBody)
console.log(student.getFullname())
console.log(student.getApproxAge())

Cela fonctionne bien mais mon problème est que j'ai: 100 propriétés en réalité. Dois-je écrire toutes les propriétés une par une dans la méthode fromJson?

Et aussi, si un nom de propriété a changé, disons: le nom est devenu LastName, je vais devoir le réparer?

Existe-t-il un moyen plus simple d'affecter dynamiquement ces valeurs à l'étudiant objet mais de conserver toutes ses méthodes ??

Quelque chose comme ça:

fromJson(json){
    this = Object.assign(this, json) //THIS IS NOT WORKING
}
7
TSR

Attribuez simplement à une instance:

 static from(json){
   return Object.assign(new Student(), json);
 }

Vous pouvez donc faire:

 const student = Student.from({ name: "whatever" });

Ou faites-en une méthode d'instance et laissez de côté l'assignation:

 applyData(json) {
   Object.assign(this, json);
 }

Afin que vous puissiez:

 const student = new Student;
 student.applyData({ name: "whatever" });

Il pourrait également faire partie du constructeur:

 constructor(options = {}) {
  Object.assign(this, options);
 }

Ensuite, vous pourriez faire:

 const student = new Student({ name: "whatever" });

Et aussi, si un nom de propriété a changé, disons: lastname est devenu LastName, je vais devoir le réparer?

Oui, vous devrez résoudre ce problème.

14
Jonas Wilms