web-dev-qa-db-fra.com

Sérialisation d'un objet de classe ES6 en tant que JSON

class MyClass {
  constructor() {
    this.foo = 3
  }
}

var myClass = new MyClass()

J'aimerais sérialiser l'objet myClass en json. 

Un moyen facile auquel je peux penser est, puisque chaque membre est en fait un objet javascript (array, etc.). Je suppose que je peux maintenir une variable pour contenir les variables de membre.

this.prop.foo = this.foo et ainsi de suite. 

Je m'attendais à trouver une bibliothèque toJSON/fromJSON pour les objets de classe, car je les utilisais avec d'autres langages tels que Swift/Java, mais je ne pouvais pas en trouver une pour javascript. 

La construction de classe est peut-être trop nouvelle, ou ce que je demande peut être facilement réalisé sans une bibliothèque. 

9
eugene

Comme pour tout autre objet que vous souhaitez stringifier dans JS, vous pouvez utiliser JSON.stringify :

JSON.stringify(yourObject);

class MyClass {
  constructor() {
    this.foo = 3
  }
}

var myClass = new MyClass()

console.log(JSON.stringify(myClass));

Il est également intéressant de noter que vous pouvez personnaliser la manière dont stringify sérialise votre objet en lui donnant une méthode toJSON . La valeur utilisée pour représenter votre objet dans la chaîne JSON résultante sera le résultat de l'appel de la méthode toJSON sur cet objet.

6
nbrooks

Je sais que cette question est ancienne, mais je me suis égaré les yeux jusqu'à ce que j'écrive une véritable solution compacte, "sûre". 

La désérialisation renvoie des objets auxquels des méthodes de travail sont encore attachées.

La seule chose à faire est d’enregistrer les classes que vous voulez utiliser dans le constructeur du sérialiseur.


class Serializer{
    constructor(types){this.types = types;}
    serialize(object) {
        let idx = this.types.findIndex((e)=> {return e.name == object.constructor.name});
        if (idx == -1) throw "type  '" + object.constructor.name + "' not initialized";
        return JSON.stringify([idx, Object.entries(object)]);
    }
    deserialize(jstring) {
        let array = JSON.parse(jstring);
        let object = new this.types[array[0]]();
        array[1].map(e=>{object[e[0]] = e[1];});
        return object;
    }
}

class MyClass {
    constructor(foo) {this.foo = foo;}
    getFoo(){return this.foo;}
}

var serializer = new Serializer([MyClass]);

console.log(serializer.serialize(new MyClass(42)));
//[0,[["foo",42]]]

console.log(serializer.deserialize('[0,[["foo",42]]]').getFoo());
//42

Ce qui précède devrait suffire à vous aider, mais vous trouverez plus de détails et une version abrégée ici .

4
guest

Je suis tombé sur cette bibliothèque qui effectue la sérialisation et la désérialisation d'objets complexes:

https://github.com/typestack/class-transformer

Il a au moins deux méthodes:

plainToClass() -> json obj to class
classToPlain() -> class to json obj

Cela pourrait aider à gagner du temps pour ceux qui recherchent une telle solution

1
vir us