使用非固定格式处理 JSON 数据



通常在使用 JSON 时,你会得到一个具有已知和指定格式的 JSON 对象。因此,例如,如果我们在一个网站上列出了电影的标题和评级,那么您的 JSON 数据如下所示:

{
{
"title": "Inception",
"rating": 4
},
{
"title": "The Dark Knight",
"rating": 5
},
etc...
}

在Javascript中,通过执行以下操作很容易遍历此JSON:

for (let i = 0; i < movies.length; i++) {
console.log('The title: ' + movies[i][0]);
console.log('The rating: ' + movies[i][1]);
}

但是,如果您获得的 JSON 对象没有上述预定义格式怎么办。示例中的 JSON 由多个对象组成,这些对象都具有两个属性,分别称为 title 和 rating。因为结构/格式是已知的,所以很容易相应地循环访问它。但是,当单个JS代码必须遍历没有预定义格式的JSON时,我怎么知道如何遍历它呢?例如,如果用户可以在对象中放置无限的对象,而我的代码不知道它与它有什么关系,该怎么办?

我正在尝试制作一个简单的应用程序,将JSON转换为HTML。使用HTML(类似于XML),作为开发人员,您可以选择要相互放入多少元素。不同的标记具有完全不同的格式,有些人嵌套了很多元素,而另一些人则不使用很多嵌套元素等。我如何处理与 HMTL 解析器处理相同的事情,但使用 JSON?

我尝试至少编写一点代码来开始,但是当我意识到代码确实必须能够处理任何类型的格式时,我就会陷入困境。

我需要实现什么样的逻辑才能理解这一点?我不是要求一段代码来为我完成所有这些工作,但我想知道人们如何处理这样的问题,以及可以使用什么样的技巧来实现这一点。

您可以简单地使用Object.keys函数。 它是对象中键的返回数组。 然后你循环抛出这个数组

您可以使用for .. in.

例:

let user = {
name: "Me",
age: 100,
website: "http://stackoverflow.com"
};
for (key in user){
console.log(key," ", user[key])
}

更新:如果要递归遍历具有非固定格式对象的数组。 使用数组函数查看此示例Map

let myMap = function (arr){  
	arr.map((obj) => {
for (key in obj){
if ( obj[key] instanceof Array){
myMap(obj[key])
} else {
console.log(key, " ", obj[key])
}
}
	})
}
let myArr = [{
name: "Me",
age: 100,
website: "http://stackoverflow.com"
},
{
name: "You",
age: 99,
questions: [{"q1": "How are you ?"}, {"q2": "What is your name ?"}]
}
]
myMap(myArr)

您需要编写一些递归逻辑,该逻辑知道如何处理可以传入的每个数据类型。让我们将其分为两类:对象和非对象。

如果您的解析器遇到的数据类型是非对象(即数字、字符串、数组等),那么大概您知道如何处理它。如果您的解析器遇到一个对象,则应再次触发函数的启动(在其当前执行范围内)。这似乎是一个漫长且可能性能繁重的选项,但我认为没有其他方法可以向下钻取任意多层的 JSON 数据。

最新更新