为什么这个jQuery .each循环不能正确遍历json数据?

4
这里是我的ajax请求代码:
$.ajax({ 
    url: 'url-to-json',
    type: 'POST',
    dataType: 'json',
    cache: 'false',
    data: { lat: lat, lng: lng }
}).done(function(data) {
    $.each(data, function(a) {
        alert(data[a]);
    });
});

以下是需要翻译的内容:

这里是正在迭代的JSON:

[
{"Id":"4c75bd5666be6dcb9f70c10f","Name":"BXtra","EnglishName":null,"Lat":35.7515869140625,"Lng":139.33872985839844},

{"Id":"4c5160a1d2a7c9b655d51211","Name":"セブンイレブン 武蔵野台店","EnglishName":null,"Lat":35.750205993652344,"Lng":139.33448791503906},

...
]

但是它没有真正给我访问json数组中每个项目的属性,而是逐个循环遍历数组中的每个字符。

我做错了什么?


尝试将一个“success”回调函数传递给.ajax函数,而不是使用.done() - Blazemonger
谢谢你的建议。我也尝试了这个方法。但是它仍然会逐个循环遍历JSON结果中的每个字符。 - Chaddeus
1
我也怀疑问题出在你的JSON上。你确定你得到的JSON是可解析的吗? - Blazemonger
谢谢,手动调用 $.parseJSON(json) 是可行的。我需要更仔细地查看返回的 MIME 类型。 - Chaddeus
4个回答

9
您可以以两种方式修改您的$.each函数:
$.each(data, function(index,el) {
    // el = object in array
    // access attributes: el.Id, el.Name, etc
});

或者,

$.each(data, function() {
    // this = object in array
    // access attributes: this.Id, this.Name, etc
});

如果在你的done函数中,data是一个字符串而不是对象,那么你需要运行以下代码:
data = $.parseJSON(data)

在您的$.each循环之前。

我尝试了这个...它似乎每个el都在引用json的每个单独字符...几乎就像它是一个字符串,而循环迭代的是每个单独字符而不是数组中的每个条目。 - Chaddeus
哦,这种情况下 data 可能会以字符串形式返回,而不是对象形式。在 done 函数内部运行 alert(typeof data)。如果返回的是 string,那么 data 就没有被转换为对象形式。我不知道 .done() 是否使用 $.ajaxdataType 属性,或者它是否仅使用原始响应。 - jackwanders
就是这样...尽管我将类型设置为JSON,但它并没有解析它...谢谢! - Chaddeus
@Chad 你有检查服务器返回的 MIME 类型吗?http://docs.jquery.com/Specifying_the_Data_Type_for_AJAX_Requests - Christophe

4

使用 this 来引用 .each 内部的当前元素:

$.ajax({ 
    url: 'url-to-json',
    type: 'POST',
    dataType: 'json',
    cache: 'false',
    data: { lat: lat, lng: lng }
}).done(function(data) {
    $.each(data, function() {
        alert(this.Id);
    });
});

为了解释清楚,OP的方法在使用data[a]时检索对象,但仍需要引用该对象的属性。如果OP将其修改为类似于data[a].Iddata[a]['Id']或类似的内容,则OP的方法将是可行的。然而,在.each内部,this==object[key],也就是说,this==data[a] - Brad Christie
使用 this 仍然会逐个迭代 JSON 中的每个字符。如果我 alert(this),它会逐个显示每个字符。如果我 alert(this.Id),它会显示未定义。 - Chaddeus
1
我已经验证过它并且可用。你确定 done 变量中有正确的数据吗? - Zbigniew
尽管我将类型设置为JSON,但仍然出现了无法解析的情况。 - Chaddeus

0

也许你的服务器没有返回正确的 MIME 类型给 JSON('application/json'),导致 JQuery 将其解释为字符串?


0

对我来说,始终使用成功都是有效的:

$.ajax({ 
  url: 'url-to-json',
  type: 'POST',
  dataType: 'json',
  cache: 'false',
  data: { lat: lat, lng: lng },
  success: function(data) {
    $.each(data, function() {
      alert(this.Id);
    });
  }
});

强制解析JSON的方法是:如果dataType出现问题,则可以使用jQuery.parseJSON(json)作为临时解决方案...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接