在写入 .json 文件之前,我在对象数组上使用 JSON.stringify()
。我收到有关循环引用的错误。
TypeError: Converting circular structure to JSON
at JSON.stringify (<anonymous>)
at TASKS.save (/home/yury.stanev/menlolab/runner/lib/tasks.js:89:27)
at Timeout.setInterval [as _onTimeout] (/home/yury.stanev/menlolab/runner/lib/tasks.js:124:12)
at ontimeout (timers.js:436:11)
at tryOnTimeout (timers.js:300:5)
at listOnTimeout (timers.js:263:5)
at Timer.processTimers (timers.js:223:10)
使用unil.inspect
我找到了以下object的循环引用行37 。我正在尝试使用自定义 toJSON()
方法将其过滤掉。我不确定如何实际访问所需的属性来执行此操作。我的代码如下:
toJSON() {
const cleanObj = {};
for (const prop in this) {
if (this.hasOwnProperty(prop) && prop !== '_task' && prop !== '_handle') {
cleanObj[prop] = this[prop];
}
}
return cleanObj;
}
解决此问题的最佳方法是什么?
最佳答案
解决这个问题主要有两种方法:
<小时/>一是使用cycle.js它引入了两个函数,JSON.decycle()
和 JSON.retrocycle()
,这使得将循环结构和 dags 编码和解码为扩展且向后兼容的 JSON 格式成为可能.
或者您可以实现自己的解决方案,该解决方案需要通过可序列化的值查找和替换(或删除)循环引用。
下面的代码片段说明了如何使用 JSON.stringify()
的 replacer
参数查找和过滤(从而导致数据丢失)循环引用:
var circularReference = {otherData: 123};
circularReference.myself = circularReference;
const getCircularReplacer = () => {
const seen = new WeakSet();
return (key, value) => {
if (typeof value === "object" && value !== null) {
if (seen.has(value)) {
return;
}
seen.add(value);
}
return value;
};
};
JSON.stringify(circularReference, getCircularReplacer());
请引用here了解更多信息。
关于arrays - 在写入 .json 文件之前使用 toJSON() 从对象数组中过滤掉循环引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57908529/