【问题标题】:About getJSON function in jQuery关于 jQuery 中的 getJSON 函数
【发布时间】:2012-01-16 12:15:24
【问题描述】:
{
   "Adam":{
      "Math":"93",
      "Science":"96",
      "Email":"adam@example.com",
      "City":"NY"
   },
   "Tom":{
      "Math":"65",
      "Science":"56",
      "Email":"tom@example.com",
      "City":"LA"
   },
   "Joe":{
      "Math":"74",
      "Science":"83",
      "Email":"joe@example.com",
      "City":"Washington"
   }
}

以上是 http://ActualUrl/path.json 处的 JSON 内容

我正在访问 JSON 文件并使用下面的代码在两个数组中填充名称和科学标记。

     var names=[];
     var marks=[];
    $.getJSON("http://path.json",function(data){               
                $.each(data, function(key, val) {   
                     names.push(key);
                    // I placed alert the check the value key.
            marks.push(parseInt(val.Science));                  
                    });
                });
    alert(names.toString()); // names is found blank
    alert(marks.toString()); 

当我最后检查数组时。发现数组为空白。为什么 getJSON 出现这种错误行为?我在每个中放置了警报并检查了值。它返回正确的值。

【问题讨论】:

  • 如果你只使用 alert(names) 和 alert(marks) 会怎样?不使用 toString() 函数
  • 数组不能像 alert(names) 一样打印

标签: javascript jquery json jsonp


【解决方案1】:

$.getJSON 异步触发,这意味着在大多数情况下,在您读出变量时它还没有完成。您将需要重组您的解决方案,以便在成功回调中执行您想做的事情:

$.getJSON("http://path.json", function(data) {
    $.each(data, function(key, val) {
        names.push(key);
        marks.push(parseInt(val.Science));
    });

    // do your thing here.
});

【讨论】:

  • @karim79,谢谢..!由于很好的解释,我接受了上述内容:)
【解决方案2】:

主要问题

您正在异步回调中填充您的数组,但会立即提醒他们。所以,这就是发生的事情:

  1. 您执行 ajax 调用。请求被发送到服务器。

  2. 警告数组的值。它们是空白的,因为服务器还没有回复。

  3. 服务器回复,您的回调被触发并且数组被填充。太晚了。

解决方案:

将警报逻辑放入回调中。

其他说明

jQuery.each 用于迭代集合。另一方面,你有一个对象(或字典)。

试试这个代码:

for(key in data) {
  names.push(key);
  var val = data[key];
  marks.push(parseInt(val.Science));                  
}

for ... in ... 构造迭代对象属性,这是你想要的。

【讨论】:

  • 在向数组添加任何内容之前不要忘记检查data.hasOwnProperty(key)。见developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
  • 其实这不是真正的问题。异步回调是:-)
  • @SergioTulentsev,使用您的代码,marks.toString() 返回正确的输出,但 names.toString() 为空白。为什么会这样?
  • @Umesh:检查拼写错误。在我的机器上工作。
  • @SergioTulentsev,谢谢!!它可以工作,但服务器响应很慢。可能有时它不起作用:)
【解决方案3】:

$.each 描述:遍历一个 jQuery 对象,为每个匹配的元素执行一个函数。 (来自:http://api.jquery.com/each/

返回的 JSON 不是 jQuery 对象,只是一个普通的 JavaScript 对象。请改用 foreach(key in data)。

哦,将 alert() 移到回调函数中:)

【讨论】:

    猜你喜欢
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    • 2016-03-13
    相关资源
    最近更新 更多