Serializando object que contém valor de object cíclico

Eu tenho um object (tree de análise) que contém nós filhos que são referências a outros nós.

Gostaria de serializar esse object, usando JSON.stringify() , mas recebo: TypeError: cyclic object value por causa das construções que mencionei.

Como eu poderia trabalhar com isso? Não importa para mim se essas referências a outros nós estão representadas ou não no object serializado.

Por outro lado, remover essas propriedades do object quando elas estão sendo criadas parece entediante e eu não gostaria de fazer alterações no analisador (narcissus).

    Use o segundo parâmetro de stringify , a function de substituição , para excluir objects já serializados:

     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/

    Como corretamente apontado em outros comentários, este código remove todos os objects “vistos”, não apenas os “recursivos”.

    Por exemplo, para:

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

    o resultado será incorreto. Se sua estrutura é assim, o decycle de Crockford é uma opção melhor.

    Eu criei um GitHub Gist que é capaz de detectar estruturas cíclicas e também as de- e codifica-as: https://gist.github.com/Hoff97/9842228

    Para transformar apenas use JSONE.stringify / JSONE.parse. Ele também codifica e codifica funções. Se você quiser desabilitar isso, basta remover as linhas 32-48 e 61-85.

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

    Você pode encontrar um exemplo de violino aqui:

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

    muito saver e mostra onde estava um object de ciclo .

      

    produz

     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 } ); } 

    Uma precondição estava faltando, caso contrário, os valores inteiros em objects de matriz são truncados, ou seja, [[08.11.2014 12:30:13, 1095]] 1095 é reduzido para 095.

    Eu também crio um projeto github que pode serializar o object cíclico e restaurar a class se você salvá-lo no atributo serializename como uma String

     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

    Edit: Eu tenho transformar meu script para NPM https://github.com/bormat/borto_circular_serialize e eu tenho alterar nomes de function de francês para inglês.