如何在JSON.stringify中找到循环结构:Uncaught TypeError:将循环结构转换为JSON?

时间:2014-01-06 15:34:27

标签: javascript json circular-reference

当我在大型结构上得到Uncaught TypeError: Converting circular structure to JSON时,很难找到圆形参考的确切位置。

有没有一种简单的方法可以在数据结构中查找/调试循环元素?

1 个答案:

答案 0 :(得分:5)

我还没有找到一个简单的方法,其他人似乎建议在JSON.stringify中使用自定义替换函数来控制访问过哪些属性。

我试图写这样的替换者:

function detector(obj) {
    function collector (stack, key, val) {
        var idx = stack[stack.length - 1].indexOf(key);

        try {
            var props = Object.keys(val);
            if (!props.length) throw props;
            props.unshift({idx : idx});
            stack.push(props);
        } catch (e) {
            while (!(stack[stack.length - 1].length - 2)) {
                idx = stack[stack.length -1][0].idx;
                stack.pop();
            }

            if (idx + 1) {
                stack[stack.length - 1].splice(idx, 1);
            }
        }

        return val;
    }

    var stack = [[]];

    try {
        JSON.stringify(obj, collector.bind(null, stack));
    } catch (e) {
        if (e.message.indexOf('circular') !== -1) {
            var idx = 0;
            var path = '';
            var parentProp = '';
            while(idx + 1) {
                idx = stack.pop()[0].idx;
                parentProp = stack[stack.length - 1][idx];
                if (!parentProp) break;
                path = '.' + parentProp + path;
            }

            console.log(path);
        }
    }
}

它的作用是在遍历JSON树(可能是树:)时收集已经访问过的属性的名称,一旦JSON.stringify检测到循环引用和抛出,'stack'变量将包含其中的一个跟踪子树它正在穿越。它将此路径记录到控制台。

但是,这不是经过严格测试的解决方案。