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