Serializzare l’object che contiene il valore dell’object ciclico

Ho un object (albero di analisi) che contiene nodes figlio che sono riferimenti ad altri nodes.

Mi piacerebbe serializzare questo object, usando JSON.stringify() , ma ottengo: TypeError: cyclic object value causa dei costrutti che ho citato.

Come potrei aggirare questo? Non mi importa se questi riferimenti ad altri nodes sono rappresentati o meno nell’object serializzato.

D’altro canto, la rimozione di queste proprietà dall’object quando vengono create sembra noiosa e non vorrei apportare modifiche al parser (narciso).

    Usa il secondo parametro di stringify , la funzione replacer , per escludere oggetti già serializzati:

     var 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/

    Come correttamente sottolineato in altri commenti, questo codice rimuove ogni object “visto”, non solo quelli “ricorsivi”.

    Ad esempio, per:

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

    il risultato sarà errato. Se la tua struttura è così, il decycle di Crockford è un’opzione migliore.

    Ho creato un GitHub Gist che è in grado di rilevare strutture cicliche e anche de-e codificarle: https://gist.github.com/Hoff97/9842228

    Per trasformare basta usare JSONE.stringify / JSONE.parse. Inoltre decodifica e codifica le funzioni. Se si desidera disabilitare questo basta rimuovere le righe 32-48 e 61-85.

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

    Puoi trovare un esempio di violino qui:

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

    molto più sicuro e mostra dove si trovava un object ciclo .

      

    produce

     jsonify = {"g":{"d":[2,5],"j":2},"e":10,"someloopshere":[{"d":[2,5],"j":2},"__cycle__",{"a":[10,"__cycle__"]}]} 
     function stringifyObject ( obj ) { if ( _.isArray( obj ) || !_.isObject( obj ) ) { return obj.toString() } var seen = []; return JSON.stringify( obj, function( key, val ) { if (val != null && typeof val == "object") { if ( seen.indexOf( val ) >= 0 ) return seen.push( val ) } return val } ); } 

    Mancava una condizione preliminare, altrimenti i valori interi negli oggetti array vengono troncati, ovvero [[08.11.2014 12:30:13, 1095]] 1095 viene ridotto a 095.

    Creo anche un progetto github che può serializzare oggetti ciclici e ripristinare la class se la si salva nell’attributo serializename come una stringa

     var d={} var a = {b:25,c:6,enfant:d}; d.papa=a; var b = serializeObjet(a); assert.equal( b, "{0:{b:25,c:6,enfant:'tab[1]'},1:{papa:'tab[0]'}}" ); var retCaseDep = parseChaine(b) assert.equal( retCaseDep.b, 25 ); assert.equal( retCaseDep.enfant.papa, retCaseDep ); 

    https://github.com/bormat/serializeStringifyParseCyclicObject

    Modifica: ho trasformato il mio script per NPM https://github.com/bormat/borto_circular_serialize e ho cambiato i nomi delle funzioni dal francese all’inglese.