如何使用javascript和jquery
获取json文件的数组json我对下一个代码感到满意,但它不起作用:
var questions = [];
function getArray(){
$.getJSON('questions.json', function (json) {
for (var key in json) {
if (json.hasOwnProperty(key)) {
var item = json[key];
questions.push({
Category: item.Category
});
}
}
return questions;
})
}
这是名为:questions.json
的json文件{
"Biology":{
"Category":{
"cell":{
"question1":{
"que1":"What is the cell?"
},
"option1":{
"op1":"The cell is the basic structural and functional unit",
"op2":"is a fictional supervillain in Dragon Ball"
},
"answer1":"opt1"
}
}
},
"Astronomy":{
"Category":{
"Mars":{
"question1":{
"que1":"How many moons does Mars?"
},
"option1":{
"op1":"5",
"op2":"2"
},
"answer1":"opt2"
}
}
}
}
我希望得到一个这种格式的数组{生物学:{分类:{cell:{question1 ....}}}}
答案 0 :(得分:9)
$.getJSON
是一个异步函数,因此返回该函数内部的任何内容都不起作用,因为它不在范围内,或者尚未收到。你可能应该这样做:
function getArray(){
return $.getJSON('questions.json');
}
getArray().done(function(json) {
// now you can use json
var questions = [];
$.each(json, function(key, val) {
questions[key] = { Category: val.Category };
});
});
答案 1 :(得分:3)
for
循环中的条件可防止将任何内容添加到数组中。相反,检查您的json对象是否具有该属性,然后获取该值并将其添加到您的数组中。换句话说:
if (questions.hasOwnProperty(key))
应为if (json.hasOwnProperty(key))
另外,你不能简单地return
这样的AJAX调用的结果,因为该方法是异步运行的。 return
实际上应用于内部success
函数回调,而不是getArray
。您必须使用回调模式,以便仅在收到数据后传递数据,并相应地对其进行操作。
(当然,由于数组是在外部作用域中定义的,所以无论如何都不必返回它,但是如果你试图在AJAX方法结束之前使用它,那么它将是空的。)
假设您要使用名为renderJSON
的方法将其呈现给DOM:
var questions = [];
function getArray(){
$.getJSON('questions.json', function (json) {
for (var key in json) {
if (json.hasOwnProperty(key)) {
var item = json[key];
questions.push({
Category: item.Category
});
}
}
renderJSON(questions);
});
}