Según the JSON docs at Mozilla, JSON.Stringify
tiene un segundo parámetro censor
que se puede utilizar para filtrar/ignore artículos infantiles al analizar el árbol. Sin embargo, quizás puedas evitar las referencias circulares.
En Node.js no podemos. Por lo que podemos hacer algo como esto:
function censor(censor) {
var i = 0;
return function(key, value) {
if(i !== 0 && typeof(censor) === 'object' && typeof(value) == 'object' && censor == value)
return '[Circular]';
if(i >= 29) // seems to be a harded maximum of 30 serialized objects?
return '[Unknown]';
++i; // so we know we aren't using the original object anymore
return value;
}
}
var b = {foo: {bar: null}};
b.foo.bar = b;
console.log("Censoring: ", b);
console.log("Result: ", JSON.stringify(b, censor(b)));
El resultado:
Censoring: { foo: { bar: [Circular] } }
Result: {"foo":{"bar":"[Circular]"}}
Desafortunadamente parece que hay un máximo de 30 iteraciones antes de que asume automáticamente que es circular. De lo contrario, esto debería funcionar. Incluso utilicé areEquivalent
from here, pero JSON.Stringify
todavía arroja la excepción después de 30 iteraciones. Aún así, es lo suficientemente bueno para obtener una representación decente del objeto en un nivel superior, si realmente lo necesita. Sin embargo, tal vez alguien puede mejorar sobre esto? En Node.js para una solicitud de objeto HTTP, estoy recibiendo:
{
"limit": null,
"size": 0,
"chunks": [],
"writable": true,
"readable": false,
"_events": {
"pipe": [null, null],
"error": [null]
},
"before": [null],
"after": [],
"response": {
"output": [],
"outputEncodings": [],
"writable": true,
"_last": false,
"chunkedEncoding": false,
"shouldKeepAlive": true,
"useChunkedEncodingByDefault": true,
"_hasBody": true,
"_trailer": "",
"finished": false,
"socket": {
"_handle": {
"writeQueueSize": 0,
"socket": "[Unknown]",
"onread": "[Unknown]"
},
"_pendingWriteReqs": "[Unknown]",
"_flags": "[Unknown]",
"_connectQueueSize": "[Unknown]",
"destroyed": "[Unknown]",
"bytesRead": "[Unknown]",
"bytesWritten": "[Unknown]",
"allowHalfOpen": "[Unknown]",
"writable": "[Unknown]",
"readable": "[Unknown]",
"server": "[Unknown]",
"ondrain": "[Unknown]",
"_idleTimeout": "[Unknown]",
"_idleNext": "[Unknown]",
"_idlePrev": "[Unknown]",
"_idleStart": "[Unknown]",
"_events": "[Unknown]",
"ondata": "[Unknown]",
"onend": "[Unknown]",
"_httpMessage": "[Unknown]"
},
"connection": "[Unknown]",
"_events": "[Unknown]",
"_headers": "[Unknown]",
"_headerNames": "[Unknown]",
"_pipeCount": "[Unknown]"
},
"headers": "[Unknown]",
"target": "[Unknown]",
"_pipeCount": "[Unknown]",
"method": "[Unknown]",
"url": "[Unknown]",
"query": "[Unknown]",
"ended": "[Unknown]"
}
he creado un módulo de Node.js pequeño para hacer esto aquí: https://github.com/ericmuyser/stringy dude para mejorar/contribuir!
Usted está tratando de enviar un objeto que tiene referencias circulares en el mismo. ¿Qué es 'pagedoc'? –
¿Qué quieres decir? – Skizit
¿Qué quiero decir con qué? 1. ¿Cuál es el valor de 'pagedoc'? 2. Referencia circular: 'a = {}; a.b = a; ' –