gpt4 book ai didi

javascript - 如何重新格式化这个简单的 JSON,使其不会捕获 "Circular structure to JSON"异常?

转载 作者:行者123 更新时间:2023-11-28 17:03:29 25 4
gpt4 key购买 nike

简介

我正在自学 JavaScript,而 JSON 是我学习过程中的一些东西。我正在开发 JavaScript WebScraper,现在我想以 JSON 格式加载结果。

我知道我可以使用数据库、服务器客户端等来处理数据。但我想采用这种方法来学习 JSON 以及如何解析/创建/格式化它是我今天的主要目标。

解释变量

正如您可能已经猜到的,存储在上述变量中​​的数据来自 html 文件。内容示例如下:

users[] -> "<a href=\"countries.php?id=1\">Egypt</a>"
GDP[] -> "<td> $2,971</td>"
Regions[] -> "<td> Egypt </td>"
Align[] -> "<td> Eastern Bloc </td>"

代码

let countries = [];
for(let i = 0; i < users.length; i++)
{
countries.push( {
'country' : [{
'name' : users[i],
'GDP' : GDP[i],
'Region' : regions[i],
'Align' : align[i]

}]})
};



let obj_data = JSON.stringify(countries, null, 2);
fs.writeFileSync('countryballs.json', obj_data);

代码说明

我之前已加载到数组(users,GDP,regionsmalign),这些数组存储我从网站提取的数据(字符串格式)

我的想法是将其“转储”到一个对象中,stringify() 函数格式会将其格式化为 JSON。

我已经在没有循环的情况下对其进行了测试(静态数据仅用于测试)并且它有效。

错误类型

let obj_data = JSON.stringify(countries, null, 2);
^

TypeError: Converting circular structure to JSON
--> starting at object with constructor 'Node'
| property 'children' -> object with constructor 'Array'
| index 0 -> object with constructor 'Node'
--- property 'parent' closes the circle

我想从这个问题中得到什么

我想知道是什么让这个 JSON 格式成为“循环”,以及如何使这个代码实现我的目标。

注释

  • 我正在使用 Node.js 和 Visual Studio Code

编辑

这是对那些感兴趣并认为这不是一个好问题的人的进一步解释。

测试有效的代码

let countries;
console.log(users.length)
for(let i = 0; i < users.length; i++)
{
countries = {

country : [
{
"name" : 'CountryTest'
}
]
}

};

let obj_data = JSON.stringify(countries, null, 2);
fs.writeFileSync('countryballs.json', obj_data);
});

请注意,与之前的代码相比,现在我正在“手动”输入国家/地区对象的名称。

这种方式绝对有效,如下所示:

Image of the result

现在,如果我将 'CountryTest' 更改为 users[i] ,其中存储国家/地区名称(忘记为什么国家/地区被标记为用户,它超出了这个问题的范围)

它显示了之前的循环错误。

对此的“部分解决方案”是添加 +"",正如我所说,部分解决了问题,因为现在没有“循环错误”

示例:

 for(let i = 0; i < users.length; i++)
{
countries = {

country : [
{
"name" : users[i]+''
}
]
}
};

结果:

Stop downvoting without telling why... those who are learning need feedback to improve

另一个我不知道为什么的错误是,当数组 users[] 中有 32 个时,只显示 1 个国家/地区[]

这让我认为到目前为止提供的答案并不正确。

所需的 JSON 格式

{
"countries": {
"country": [
{
"name": "",
"GDP" : "",
"Region" : "",
"Align" : ""
},
{
"name": "",
"GDP" : "",
"Region" : "",
"Align" : ""
},
{
"name": "",
"GDP" : "",
"Region" : "",
"Align" : ""
}

]}
}

最佳答案

当对象的属性直接(a -> a)或间接(a -> b -> a)为对象本身时,就会发生循环结构错误。

为了避免出现错误消息,请告诉 JSON.stringify 在遇到循环引用时该怎么做。例如,如果您有一个人指向另一个人(“ parent ”),该人可能(或可能不)指向原始人,请执行以下操作:

JSON.stringify( that.person, function( key, value) {
if( key == 'parent') { return value.id;}
else {return value;}
})

stringify 的第二个参数是过滤函数。这里它只是将引用的对象转换为其 ID,但您可以自由地执行任何您喜欢的操作来打破循环引用。

您可以使用以下命令测试上述代码:

function Person( params) {
this.id = params['id'];
this.name = params['name'];
this.father = null;
this.fingers = [];
// etc.
}

var me = new Person({ id: 1, name: 'Luke'});
var him = new Person( { id:2, name: 'Darth Vader'});
me.father = him;
JSON.stringify(me); // so far so good

him.father = me; // time travel assumed :-)
JSON.stringify(me); // "TypeError: Converting circular structure to JSON"
// But this should do the job:
JSON.stringify(me, function( key, value) {
if(key == 'father') {
return value.id;
} else {
return value;
};
})

答案来自 StackOverflow 问题,

Stringify (convert to JSON) a JavaScript object with circular reference

关于javascript - 如何重新格式化这个简单的 JSON,使其不会捕获 "Circular structure to JSON"异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56630922/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com