86 votes

Stringifier (convertir en JSON) un objet JavaScript avec une référence circulaire

J'ai une définition d'objet JavaScript qui contient une référence circulaire : elle a une propriété qui fait référence à l'objet parent.

Il possède également des fonctions que je ne souhaite pas voir transmises au serveur. Comment sérialiser et désérialiser ces objets ?

J'ai lu que la meilleure méthode consiste à utiliser le logiciel stringify de Douglas Crockford. Cependant, j'obtiens l'erreur suivante dans Chrome :

TypeError : Conversion d'une structure circulaire en JSON

Le code :

function finger(xid, xparent){
    this.id = xid;
    this.xparent;
    //other attributes
}

function arm(xid, xparent){
    this.id = xid;
    this.parent = xparent;
    this.fingers = [];

    //other attributes

    this.moveArm = function() {
        //moveArm function details - not included in this testcase
        alert("moveArm Executed");
    }
}

 function person(xid, xparent, xname){
    this.id = xid;
    this.parent = xparent;
    this.name = xname
    this.arms = []

    this.createArms = function () {
        this.arms[this.arms.length] = new arm(this.id, this);
    }
}

function group(xid, xparent){
    this.id = xid;
    this.parent = xparent;
    this.people = [];
    that = this;

    this.createPerson = function () {
        this.people[this.people.length] = new person(this.people.length, this, "someName");
        //other commands
    }

    this.saveGroup = function () {
        alert(JSON.stringify(that.people));
    }
}

Il s'agit d'un cas de test que j'ai créé pour cette question. Ce code comporte des erreurs, mais j'ai essentiellement des objets dans des objets, et une référence passée à chaque objet pour montrer quel est l'objet parent lorsque l'objet est créé. Chaque objet contient également des fonctions, que je ne veux pas voir stringifiées. Je veux juste que les propriétés telles que le Person.Name .

Comment sérialiser avant d'envoyer au serveur et désérialiser en supposant que le même JSON est renvoyé ?

-13voto

Timmerz Points 1235

J'ai utilisé ce qui suit pour éliminer les références circulaires :

JS.dropClasses = function(o) {

    for (var p in o) {
        if (o[p] instanceof jQuery || o[p] instanceof HTMLElement) {
            o[p] = null;
        }    
        else if (typeof o[p] == 'object' )
            JS.dropClasses(o[p]);
    }
};

JSON.stringify(JS.dropClasses(e));

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X