JSON.stringify,避免TypeError:将循环结构转换为JSON

我有一个大对象我想转换为JSON并发送。 但它有圆形结构。 我想抛弃存在的任何循环引用,并发送任何可以字符串化的东西。 我怎么做?

谢谢。

var obj = {
  a: "foo",
  b: obj
}

我想把obj变成:

{"a":"foo"}

JSON.stringify与自定义JSON.stringify一起使用。 例如:

// Demo: Circular reference
var o = {};
o.o = o;

// Note: cache should not be re-used by repeated calls to JSON.stringify.
var cache = [];
JSON.stringify(o, function(key, value) {
    if (typeof value === 'object' && value !== null) {
        if (cache.indexOf(value) !== -1) {
            // Circular reference found, discard key
            return;
        }
        // Store value in our collection
        cache.push(value);
    }
    return value;
});
cache = null; // Enable garbage collection

本例中的替代品不是100%正确的(取决于你对“重复”的定义)。 在以下情况下,会丢弃一个值:

var a = {b:1}
var o = {};
o.one = a;
o.two = a;
// one and two point to the same object, but two is discarded:
JSON.stringify(o, ...);

但是这个概念的含义是:使用自定义替换器,并跟踪解析的对象值。


在Node.js中,您可以使用util.inspect(object)。 它会自动用“[Circular]”替换循环链接。


我真的很喜欢Trindaz的解决方案 - 更详细,但它有一些错误。 我修正了他们也喜欢它的人。

另外,我在缓存对象上添加了长度限制。

如果我打印的对象真的很大 - 我的意思是无限大 - 我想限制我的算法。

JSON.stringifyOnce = function(obj, replacer, indent){
    var printedObjects = [];
    var printedObjectKeys = [];

    function printOnceReplacer(key, value){
        if ( printedObjects.length > 2000){ // browsers will not print more than 20K, I don't see the point to allow 2K.. algorithm will not be fast anyway if we have too many objects
        return 'object too long';
        }
        var printedObjIndex = false;
        printedObjects.forEach(function(obj, index){
            if(obj===value){
                printedObjIndex = index;
            }
        });

        if ( key == ''){ //root element
             printedObjects.push(obj);
            printedObjectKeys.push("root");
             return value;
        }

        else if(printedObjIndex+"" != "false" && typeof(value)=="object"){
            if ( printedObjectKeys[printedObjIndex] == "root"){
                return "(pointer to root)";
            }else{
                return "(see " + ((!!value && !!value.constructor) ? value.constructor.name.toLowerCase()  : typeof(value)) + " with key " + printedObjectKeys[printedObjIndex] + ")";
            }
        }else{

            var qualifiedKey = key || "(empty key)";
            printedObjects.push(value);
            printedObjectKeys.push(qualifiedKey);
            if(replacer){
                return replacer(key, value);
            }else{
                return value;
            }
        }
    }
    return JSON.stringify(obj, printOnceReplacer, indent);
};
链接地址: http://www.djcxy.com/p/48227.html

上一篇: JSON.stringify, avoid TypeError: Converting circular structure to JSON

下一篇: Reverse of JSON.stringify?