如何使用getJSON从文件中获取JSON数组?

时间:2013-02-17 00:58:15

标签: javascript jquery arrays json

如何使用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 ....}}}}

2 个答案:

答案 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);
    });
}