javascript - 序列化包含循环对象值的对象

我有一个对象(分析树),其中包含对其他节点的引用的子节点。

我想序列化这个对象,使用 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 对象树的所有节点

c# - 如何从 URL 获取 JSON 字符串?

android - 在 Android 中发送和解析 JSON 对象

json - 在 ASP.NET 中使用 WebAPI 或 MVC 返回 JSON

javascript - JSON 劫持在现代浏览器中仍然是一个问题吗?

javascript - JSON.stringify 以 pretty-print 方式输出到 d

json - 将 CSV/XLS 转换为 JSON?

json - 如何在 Github Wiki 中设置 JSON block 的样式?

javascript - 如何测试字符串是否为 JSON?