2015-06-29 126 views
0

我有一个外部json文件file.json,我试图获取一个存储在它内部的数组,因此我可以将它用作Javascript数组。 JSON文件:从外部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); 

虽然它没有返回数组,警报也不能工作。是否有一个原因?而且,如果我可以在函数外部获得变量或对象,那么如何创建一个数组并将其放到外部? 谢谢!

+1

'alert()'在回调之外,所以它可能会出错,因为'Test'未定义。但里面的一切都很好。你的控制台上没有打印什么东西?任何错误?同时检查你的“网络”标签,看看你是否收到正确的数据。在附注中,如果文件存储在本地,Chrome等浏览器将阻止Ajax请求。它需要用'http://'协议或其他,但不是'file:///'提供。 – blex

+0

糟糕,我忘了提及...是的,它是在网络服务器上。控制台还提到在函数之后Test未定义。 (我希望能够访问功能以外的测试。) – Amirkhanaursrk

回答

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' 
} 
+0

控制台说,console.log(person.Name);未定义3次,这是有原因吗? – Amirkhanaursrk

+0

@Amirkhanaursrk这是因为我完全没有以错误的方式使用'... ...'。在这种情况下(或者其他的数组方法,比如'.forEach()'),一个增加了'i'的循环效果更好。修复。 – blex

0

$.getJSON()与您的alert()同时启动,但回调函数(function(json))在获取并加载数据之前不会被调用。

所以,当你要求alert(Test.Name)没有Test.Name提醒!那还没有处理。

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

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

0

这是由于异步操作$.getJSON。基本上会发生什么情况是,JS引擎通过您的程序在遇到$.getJSON的语句时执行它,然后执行它(然后等待事件循环中的响应),并继续执行下一个语句alert。由于事件循环没有出现,所以Test.name的值是undefined(实际上应该抛出一个错误,除非你在$.getJSON响应处理程序之外的地方声明了Test)。

例如:

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);

你觉得输出会是什么?运行它,并检查您的控制台输出或者只是看看这里:

> Outside the async operation undefined 
> Inside the async operation FOO 

那么你如何让你的代码的其余部分的价值,而不响应函数中嵌入了吗?两种主要方式是使用回调函数(类似于Node的首选样式)或使用promise。

如果您没有注意到您已经在使用回调函数。这就是你传递给$.getJSON的功能被称为。因此,您可以向该功能添加更多代码,或者将其分配给从现有响应处理程序调用的另一个功能。

setTimeout(function() { 
 
    var foo = 'FOO'; 
 
    console.log('Inside the async operation', foo); 
 

 
    myOtherCode(foo); 
 
}, 0); // Approximate running in next loop of the event cycle 
 

 
function myOtherCode(foo) { 
 
    console.log('Outside the async operation', foo); 
 
}

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