Gemäß die JSON-Dokumente bei Mozilla , JSON.stringify
hat einen zweiten Parameter replacer
die verwendet werden kann, um Kinderelemente beim Parsen des Baums zu filtern/zu ignorieren. Vielleicht können Sie jedoch die zirkulären Verweise vermeiden.
In Node.js können wir das nicht. Also können wir etwas wie dies tun:
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)));
Das Ergebnis:
Censoring: { foo: { bar: [Circular] } }
Result: {"foo":{"bar":"[Circular]"}}
Leider scheint es ein Maximum von 30 Iterationen zu geben, bevor es automatisch annimmt, dass es sich um einen Kreis handelt. Ansonsten sollte dies funktionieren. Ich habe sogar areEquivalent
von hier aber JSON.stringify
löst nach 30 Iterationen immer noch die Ausnahme aus. Dennoch ist es gut genug, um eine anständige Darstellung des Objekts auf oberster Ebene zu erhalten, wenn man es wirklich braucht. Vielleicht kann jemand dies noch verbessern? In Node.js erhalte ich für ein HTTP-Request-Objekt:
{
"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]"
}
Ich habe ein kleines Node.js-Modul erstellt, das dies ermöglicht: https://github.com/ericmuyser/stringy Fühlen Sie sich frei, etwas zu verbessern oder beizutragen!