Secondo i documenti JSON su Mozilla , JSON.Stringify
ha un secondo parametrocensor
che può essere utilizzato per filtrare / ignorare gli elementi figlio durante l'analisi dell'albero. Tuttavia, forse puoi evitare i riferimenti circolari.
In Node.js non possiamo. Quindi possiamo fare qualcosa del genere:
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)));
Il risultato:
Censoring: { foo: { bar: [Circular] } }
Result: {"foo":{"bar":"[Circular]"}}
Sfortunatamente sembra che ci siano un massimo di 30 iterazioni prima di assumere automaticamente che sia circolare. Altrimenti, dovrebbe funzionare. Ho anche usato areEquivalent
da qui , ma JSON.Stringify
genera ancora l'eccezione dopo 30 iterazioni. Tuttavia, è abbastanza buono per ottenere una rappresentazione decente dell'oggetto ai massimi livelli, se ne hai davvero bisogno. Forse qualcuno può migliorare su questo però? In Node.js per un oggetto richiesta HTTP, sto ottenendo:
{
"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]"
}
Ho creato un piccolo modulo Node.js per farlo qui: https://github.com/ericmuyser/stringy Sentiti libero di migliorare / contribuire!
pagedoc
?