我有一个对象(分析树),其中包含对其他节点的引用的子节点。
我想序列化这个对象,使用 JSON.stringify()
,但我得到了
TypeError: cyclic object value
因为我提到的构造。
我该如何解决这个问题?这些对其他节点的引用是否在序列化对象中表示对我来说并不重要。
另一方面,在创建对象时从对象中删除这些属性似乎很乏味,我不想对解析器进行更改(水仙)。
最佳答案
使用stringify
的第二个参数replacer function , 排除已经序列化的对象:
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/
正如其他评论中正确指出的那样,此代码删除了每个“看到”对象,而不仅仅是“递归”对象。
例如,对于:
a = {x:1};
obj = [a, a];
结果将不正确。如果您的结构是这样的,您可能想使用 Crockford 的 decycle或者这个(更简单的)函数,它只是用空值替换递归引用:
function decycle(obj, stack = []) {
if (!obj || typeof obj !== 'object')
return obj;
if (stack.includes(obj))
return null;
let s = stack.concat([obj]);
return Array.isArray(obj)
? obj.map(x => decycle(x, s))
: Object.fromEntries(
Object.entries(obj)
.map(([k, v]) => [k, decycle(v, s)]));
}
//
let a = {b: [1, 2, 3]}
a.b.push(a);
console.log(JSON.stringify(decycle(a)))
https://stackoverflow.com/questions/9382167/
相关文章:
javascript - 如何从 JavaScript 中的 URL 获取 JSON?
javascript - 使用 JavaScript 遍历 JSON 对象树的所有节点
android - 在 Android 中发送和解析 JSON 对象
json - 在 ASP.NET 中使用 WebAPI 或 MVC 返回 JSON
javascript - JSON 劫持在现代浏览器中仍然是一个问题吗?
javascript - JSON.stringify 以 pretty-print 方式输出到 d