Circular JSON指的是JSON格式中出現的循環引用,即一個對象中引用了其他對象,而被引用的對象又引用了該對象本身或其父級對象,這種情況會導致JSON數據解析出錯,甚至導致死循環。
// 示例一 var obj1 = {}; var obj2 = { prop1: obj1, }; obj1.prop2 = obj2; JSON.stringify(obj1); // 報錯,出現循環引用 // 示例二 var obj = { prop1: {}, }; obj.prop2 = obj; JSON.stringify(obj); // 報錯,出現循環引用
Circular JSON的出現通常是由于程序設計時出現了錯誤。為了解決這個問題,可以使用以下方法:
1. 避免出現循環引用。在設計程序時,盡可能避免出現對象之間的循環引用。
2. 對于已經出現了循環引用的情況,可以手動處理。例如,在JSON.stringify()方法中增加一個replacer函數,手動將循環引用的對象處理成一個占位符,然后再對JSON進行序列化,最后使用reviver函數將占位符還原成原始對象。
// 示例三 var obj1 = {}; var obj2 = { prop1: obj1, }; obj1.prop2 = obj2; var cache = []; JSON.stringify(obj1, function(key, value) { if (typeof value === 'object' && value !== null) { // 判斷是否存在循環引用 if (cache.includes(value)) { return '[Circular]'; } cache.push(value); } return value; }); // {"prop2":{"prop1":"[Circular]"} JSON.parse('{"prop2":{"prop1":"[Circular]"}}', function(key, value) { if (typeof value === 'string' && /\[Circular\]/.test(value)) { return obj1; } return value; }); // { prop2: { prop1: [Circular] } }
Circular JSON的解決辦法不僅局限于以上方法,具體解決方案需要根據具體情況而定,但需要保證在程序設計中盡量避免出現循環引用的情況。