【问题标题】:jquery loop on Json data using $.each使用 $.each 对 Json 数据进行 jquery 循环
【发布时间】:2011-01-21 11:48:20
【问题描述】:

我在一个名为 data 的变量中返回了以下 JSON。

这是返回的 JSON...

[ 
{"Id": 10004, "PageName": "club"}, 
{"Id": 10040, "PageName": "qaz"}, 
{"Id": 10059, "PageName": "jjjjjjj"}
]

我正在尝试使用 $.each 遍历集合,但我遇到了警报显示未定义的问题。我尝试了很多不同的语法,但似乎无法弄清楚。

我使用的 JQuery 是

$.each(data, function(i, item) {
    alert(item.PageName);
});

谁能指出我正确的方向?

编辑 这是我用来获取数据的代码

$.getJSON('/Cms/GetPages/123', null, function(data) {
  fillSelect(data);
});

这是在回调时调用的函数

function fillSelect(data) {
  alert(data);
  $.each(data, function(i, item) {
    alert(item.PageName);
  });
}

编辑 2 这让我有点困惑,根据文档,它应该像我拥有的​​那样工作,但事实并非如此。根据提琴手,标题显示:-

Content-Type: application/json; charset=utf-8

上面的 JSON 是完全正确的。如果这有什么不同,我正在使用 chrome。将在 IE 和 FF 中测试....

编辑 3

使用 $.get 产生

"[\r\n {\r\n \"Id\": 10041,\r\n \"PageName\": \"01234567890\",\r\n \"MetaId\": 1000,\r\n \"TemplateId\": 2\r\n },\r\n {\r\n \"Id\": 10001,\r\n \"PageName\": \"about\",\r\n \"MetaId\": 1000,\r\n \"TemplateId\": 1\r\n },\r\n {\r\n \"Id\": 10056,\r\n \"PageName\": \"fdgdfgdfg\",\r\n \"MetaId\": 1000,\r\n \"TemplateId\": 1\r\n },\r\n {\r\n \"Id\": 10052,\r\n \"PageName\": \"hjkhjk\",\r\n \"MetaId\": 1000,\r\n \"TemplateId\": 2\r\n },\r\n {\r\n \"Id\": 10059,\r\n \"PageName\": \"jjjjjjj\",\r\n \"MetaId\": 1000,\r\n \"TemplateId\": 1\r\n },\r\n {\r\n \"Id\": 10057,\r\n \"PageName\": \"qqqqq\",\r\n \"MetaId\": 1000,\r\n \"TemplateId\": 2\r\n },\r\n {\r\n \"Id\": 10054,\r\n \"PageName\": \"qwqw\",\r\n \"MetaId\": 1000,\r\n \"TemplateId\": 2\r\n }\r\n]"

【问题讨论】:

  • 它对我有用。确保将数据正确传递给每个方法。

标签: jquery json foreach


【解决方案1】:
var data = [ 
 {"Id": 10004, "PageName": "club"}, 
 {"Id": 10040, "PageName": "qaz"}, 
 {"Id": 10059, "PageName": "jjjjjjj"}
];

$.each(data, function(i, item) {
    alert(data[i].PageName);
});

$.each(data, function(i, item) {
    alert(item.PageName);
});

这两个选项效果很好,除非你有类似的东西:

var data.result = [ 
 {"Id": 10004, "PageName": "club"}, 
 {"Id": 10040, "PageName": "qaz"}, 
 {"Id": 10059, "PageName": "jjjjjjj"}
];

$.each(data.result, function(i, item) {
    alert(data.result[i].PageName);
});

编辑:

试试这个并描述结果

$.get('/Cms/GetPages/123', function(data) {
  alert(data);
});

编辑 3:

这解决了问题,但不是使用“eval”的想法,您应该看看 '/Cms/GetPages/123' 中的响应如何。

$.get('/Cms/GetPages/123', function(data) {
  $.each(eval(data.replace(/[\r\n]/, "")), function(i, item) {
   alert(item.PageName);
  });
});

【讨论】:

【解决方案2】:
$.each(JSON.parse(result), function(i, item) {
    alert(item.number);
});

【讨论】:

    【解决方案3】:

    您是否将数据从字符串转换为 JavaScript 对象?

    您可以使用data = eval('(' + string_data + ')'); 或者更安全的data = JSON.parse(string_data); 来执行此操作,但以后仅适用于 FF 3.5 或包含json2.js

    jQuery 从 1.4.1 开始也有这个功能,$.parseJSON()

    但实际上,$.getJSON() 应该给你已经解析的 json 对象,所以你应该彻底检查所有内容,有一点错误埋在某处,就像你可能忘记在 json 中引用某些内容,或者缺少一个括号.

    【讨论】:

    • 看来需要加fillselect(eval(data));
    • 顺便说一句,eval 的兼容性如何?
    • 应该是data = eval('('+string_data+')');。另外,jQuery 还有一个功能data = jQuery.parseJSON(string_data);
    • 有些地方不太对劲。只有eval(data) 有效。请看我的编辑 2
    • 我已经看到 jQuery.parseJSON(string_data) 在某些情况下失败,其中 data = eval('('+string_data+')') 工作得很好。
    【解决方案4】:

    只要使用正确的内容类型,getJSON 就会为您评估数据为 JSON。确保服务器以 application/json 形式返回数据。

    【讨论】:

    • 根据 fiddler 的内容类型是Content-Type: application/json; charset=utf-8
    猜你喜欢
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 2014-08-31
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    相关资源
    最近更新 更多