160 votes

Sérialisation d'un objet contenant une valeur d'objet cyclique

J'ai un objet (arbre d'analyse) qui contient les nœuds enfants qui sont des références à d'autres nœuds.

Je tiens à sérialiser, à l'aide de JSON.stringify(), mais j'obtiens : TypeError: cyclic object value car des constructions que j'ai mentionnés.

Comment pourrais-je contourner cela? Il n'est pas question pour moi de savoir si ces références à d'autres nœuds sont représentés ou non dans l'objet sérialisé.

D'autre part, la suppression de ces propriétés de l'objet lorsqu'ils sont en cours de création semble fastidieux et je ne voudrais pas apporter des modifications à l'analyseur (narcisse).

232voto

georg Points 52691

Utiliser le deuxième paramètre de stringify, la fonction replacer à exclure déjà d'objets sérialisés:

seen = []

JSON.stringify(obj, function(key, val) {
   if (val != null && typeof val == "object") {
        if (seen.indexOf(val) >= 0)
            return
        seen.push(val)
    }
    return val
})

http://jsfiddle.net/mH6cJ/38/

Comme souligné à juste titre dans les commentaires, ce code supprime tous les "vues" de l'objet, non seulement "récursive". Par exemple, pour

a = {x:1}
obj = [a, a]

le résultat sera faux. Si votre structure est comme ça, Crockford de decycle est une meilleure option.

2voto

Ol Sen Points 707

beaucoup d'économiseur et il montre où un objet de cycle était.

 <script>
var jsonify=function(o){
    var seen=[];
    var jso=JSON.stringify(o, function(k,v){
        if (typeof v =='object') {
            if ( !seen.indexOf(v) ) { return '__cycle__'; }
            seen.push(v);
        } return v;
    });
    return jso;
};
var obj={
    g:{
        d:[2,5],
        j:2
    },
    e:10
};
obj.someloopshere = [
    obj.g,
    obj,
    { a: [ obj.e, obj ] }
];
console.log('jsonify=',jsonify(obj));
</script>
 

produit

 jsonify = {"g":{"d":[2,5],"j":2},"e":10,"someloopshere":[{"d":[2,5],"j":2},"__cycle__",{"a":[10,"__cycle__"]}]}
 

2voto

Hoff Points 97

J'ai créé un GitHub Gist qui est capable de détecter cylcic les structures et les également de et les encode: https://gist.github.com/Hoff97/9842228

Pour transformer utilisation JSONE.stringify/JSONE.l'analyser. Il a également de et de code pour les fonctions. Si vous souhaitez désactiver cette juste supprimer des lignes 32-48 et 61-85.

var strg = JSONE.stringify(cyclicObject);
var cycObject = JSONE.parse(strg);

Vous pouvez trouver un exemple de violon ici:

http://jsfiddle.net/hoff97/7UYd4/

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