TypeError: Converting circular structure to JSON --> starting at object with constructor 'Window
时间: 2023-08-11 21:12:18 浏览: 216
这个错误通常是在将带有循环引用的 JavaScript 对象转换为 JSON 字符串时发生的。 JSON 格式不支持循环引用,因此无法将其转换为 JSON 字符串。
解决方法之一是手动处理循环引用,将其转换为非循环引用的对象或数组。另一种解决方法是使用第三方库,如 `flatted` 或 `circular-json`。
例如,可以使用 `flatted` 库将具有循环引用的对象转换为 JSON 字符串:
```js
const flatted = require('flatted');
const obj = {};
obj.a = obj;
const jsonString = flatted.stringify(obj);
console.log(jsonString);
// 输出: {"a":"[Circular ~]"}
```
注意,由于 `flatted` 库不符合标准 JSON 规范,因此在处理此类 JSON 字符串时需要使用相应的库或函数来解析它们。
相关问题
NoticeFlow.js:2727 Uncaught TypeError: Converting circular structure to JSON --> starting at object with constructor 'Window' --- property 'window' closes the circle at JSON.stringify (<anonymous>)
这个错误意味着您试图将包含循环引用的对象转换为 JSON 字符串,而 JSON.stringify() 方法无法处理循环引用。
在您的情况中,错误消息指出循环引用的起点是一个具有构造函数为 'Window' 的对象,并且循环引用的属性是 'window'。这是因为在浏览器环境中,'Window' 对象和 'window' 属性相互引用,导致循环引用。
要解决此问题,您需要确保在调用 JSON.stringify() 之前,从要转换的对象中删除循环引用的属性。
示例代码如下:
```javascript
var openedWindows = []; // 存储打开的标签页引用的数组
// 打开多个标签页
openedWindows.push(window.open('http://example.com'));
openedWindows.push(window.open('http://example2.com'));
openedWindows.push(window.open('http://example3.com'));
// 删除循环引用的属性
openedWindows.forEach(function(win) {
delete win.window;
});
// 转换为 JSON 字符串
var jsonString = JSON.stringify(openedWindows);
console.log(jsonString);
```
通过删除 'window' 属性,您可以避免循环引用,并且可以成功地将对象转换为 JSON 字符串。
caught TypeError: Converting circular structure to JSON --> starting at object with constructor 'Window' --- property 'window' closes the circle at JSON.stringify (<anonymous>) at Object.success (mzNoticeFlow.js:2731:48) at j (jquery.min.js:2:26860) at Object.fireWith [as resolveWith] (jquery.min.js:2:27673) at x (jquery.min.js:4:11120) at XMLHttpRequest.<anonymous> (jquery.min.js:4:14767)
这个错误表示您试图将包含循环引用的转换为 JSON 字符串,而 JSON.stringify 方法无法处理循环引用。
在您情况中,错误消息指出循环引用的起点是一个有构造函数为 'Window' 的对象,并循环引用的属性是 'window'。是因为在浏览器环境中,'Window' 对象和 'window' 属性相互引用,导致循环引用。
由于无法直接访问其他窗口的全局对象,因此无法将它们换为 JSON 字符串。如果您尝试将 window 对象或包含 window 对象的对象传递给 JSON.stringify(),将会出现循环引用错误。
解决此的一种方法是在存储窗口引用时,只存储有限信息,例如窗口的 URL 或其他标识符。这样您就可以在需要时重新打开窗口。例如:
```javascript
var openedWindows = []; // 存储打开的标签页信息的数组
// 打开多个标签页
var win1 = window.open('http://example.com');
var win2 = window.open('http://example2.com');
var win3 = window.open('://example3.com');
// 存储标签页信息
openedWindows.push({ url:1.location.href });
openedWindows.push({ url: win2.location.href });
openedWindows.push({ url: win3.location.href });
// 转换为 JSON 字符串
var jsonString = JSON.stringify(openedWindows);
console.log(jsonString);
```
通过存储标签页的 URL 或其他标识符,您可以避免循环引用,并且可以成功地将对象转换为 JSON 字符串。
阅读全文