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

时间:2017-03-17 13:25:48

标签: javascript jquery 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?

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

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

2 个答案:

答案 0 :(得分:3)

您只需使用Object.keys功能即可。它返回对象中的键数组。然后你循环抛出这个数组

您可以使用for .. in

示例:

&#13;
&#13;
let user = {
  name: "Me",
  age: 100,
  website: "http://stackoverflow.com"
};

for (key in user){
  console.log(key," ", user[key])
}
&#13;
&#13;
&#13;

更新:如果要以递归方式使用非固定格式对象循环遍历数组。使用Map数组函数

查看此示例

&#13;
&#13;
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)
&#13;
&#13;
&#13;

答案 1 :(得分:1)

您需要编写一些知道如何处理可传递给它的每种数据类型的递归逻辑。我们将它分为两​​类:对象和非对象。

如果您的解析器遇到的数据类型是非对象(即数字,字符串,数组等),那么您可能知道如何处理它。如果您的解析器遇到一个对象,那么应该再次触发该函数的启动(在其当前执行中)。这似乎是一个很长且可能性能很重的选项,但我认为没有其他方法可以深入研究任意多层的JSON数据。