Theo tài liệu JSON tại Mozilla , JSON.Stringify
có tham số thứ haicensor
có thể được sử dụng để lọc / bỏ qua các mục con trong khi phân tích cú pháp cây. Tuy nhiên, có lẽ bạn có thể tránh các tài liệu tham khảo tròn.
Trong Node.js chúng ta không thể. Vì vậy, chúng ta có thể làm một cái gì đó như thế này:
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)));
Kết quả:
Censoring: { foo: { bar: [Circular] } }
Result: {"foo":{"bar":"[Circular]"}}
Thật không may, dường như có tối đa 30 lần lặp trước khi nó tự động giả định nó là thông tư. Nếu không, điều này sẽ làm việc. Tôi thậm chí đã sử dụng areEquivalent
từ đây , nhưng JSON.Stringify
vẫn ném ngoại lệ sau 30 lần lặp. Tuy nhiên, nó đủ tốt để có được một đại diện tốt của đối tượng ở mức cao nhất, nếu bạn thực sự cần nó. Có lẽ ai đó có thể cải thiện điều này mặc dù? Trong Node.js cho một đối tượng yêu cầu HTTP, tôi nhận được:
{
"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]"
}
Tôi đã tạo một mô-đun Node.js nhỏ để thực hiện việc này tại đây: https://github.com/ericmuyser/opesy Hãy thoải mái cải thiện / đóng góp!
pagedoc
gì