从外部Json获取数组

时间:2015-06-29 20:15:24

标签: javascript arrays json external

我有一个外部json文件file.json,我正在尝试将一个数组存储在其中,以便我可以将它用作Javascript数组。 JSON文件:

{
    "data": [
        {
            "Name": "Steve",
            "Number": "120",
            "Number2": "78",
            "Number3": "75",
            "Number3": "85"
        },
        {
            "Name": "Bob",
            "Number": "130",
            "Number2": "98",
            "Number3": "85",
            "Number3": "85"
        },
        {
            "Name": "Joe",
            "Number": "430",
            "Number2": "88",
            "Number3": "75",
            "Number3": "89"
        }
    ]
}

"数据"之后有一个数组,我想将它用作数组。 这就是我的尝试:(只是为了测试)

$.getJSON( "file.json", function( json ) {
    for (var i = 0; i < json.data.length; i++) {
        var Test = json.data[i]; 
        console.log(Test.Name);
    }
});
alert(Test.Name);

虽然它没有返回阵列,但警报也没有工作。是否有一个原因?并且,如果我可以在函数外部获取变量或对象,我如何创建一个数组并将其传递到外部? 谢谢!

3 个答案:

答案 0 :(得分:0)

sencha app run native$.getJSON()同时启动,但在获取并加载数据之前,不会调用回调函数(alert())。

因此,当您要求function( json )时,没有alert(Test.Name)提醒!那还没有处理完毕。

Test.Name

您无法在函数外部访问Test,因为它在其中定义。在函数外部的范围内定义它将允许访问它,但是在JSON回调完成之前它将是一个空数组。

答案 1 :(得分:0)

// Define it where you want it to be accessible
var people;

$.getJSON("file.json", function (json) {
    // Store the data in people to make it accessible globally
    people = json.data;
    people.forEach(function(person){ console.log(person.Name); });
    doSomethingElse();
});

// Would cause an error, you didn't receive the data yet
alert(people[0].Name); // Uncaught TypeError: Cannot read property '0' of undefined

// Would work if it is called after receiving the data (inside the callback or later)
function doSomethingElse(){
    alert(people[0].Name); // 'Steve'
}

答案 2 :(得分:0)

这是由$.getJSON的异步操作引起的。基本上发生的是JS引擎在您的程序中工作,它遇到$.getJSON的语句,执行它(然后等待事件循环中的响应)并继续执行下一个语句{{1} }。由于事件循环尚未查看是否存在响应,alert的值为Test.name(实际上应该抛出错误,除非您在...之外的某处声明了undefined Test响应处理程序)。

例如:

&#13;
&#13;
$.getJSON
&#13;
&#13;
&#13;

您认为产量是多少?运行它并检查您的控制台输出或只看这里:

var foo;

// using setTimeout as a proxy async operation for $.getJSON
setTimeout(function() {
  foo = 'FOO';
  console.log('Inside the async operation', foo);
}, 0); // Approximate running in next loop of the event cycle

console.log('Outside the async operation', foo);

那么如何在不将代码嵌入到响应函数中的情况下获得其余代码的值?两种主要方式是使用回调函数(类似于Node&#39;首选样式)或使用promises。

如果您没有注意到您已经在使用回调功能。这就是您传递给> Outside the async operation undefined > Inside the async operation FOO 的函数被称为。因此,您可以向该函数添加更多代码,或将其分解为从现有响应处理程序调用的另一个函数。

&#13;
&#13;
$.getJSON
&#13;
&#13;
&#13;

或者你可以使用承诺。由于Promise的原生JS实现相对较新,因此存在许多库,允许您在旧版浏览器上使用它们以及包括额外功能。