代码之家  ›  专栏  ›  技术社区  ›  Rippo

jquery使用$.对json数据进行循环。

  •  152
  • Rippo  · 技术社区  · 14 年前

    我在名为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 这让我有点困惑,根据文档,它应该按我拥有的方式工作,但它没有。根据fiddler,标题显示:

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

    上面的JSON是完全正确的。我用的是铬,如果这有什么不同的话。将在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]"
    
    4 回复  |  直到 6 年前
        1
  •  282
  •   andres descalzo    14 年前
    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
  •  16
  •   vava    14 年前

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

    你可以用 data = eval('(' + string_data + ')'); 或者更安全, data = JSON.parse(string_data); 但以后只能在FF 3.5中使用,或者如果包括 json2.js

    jquery自1.4.1起也有相应的功能, $.parseJSON() .

    但实际上, $.getJSON() 应该给您已经解析过的JSON对象,所以您应该彻底检查所有内容,不会有什么错误隐藏在某个地方,比如您可能忘记了在JSON中引用某些内容,或者缺少一个括号。

        3
  •  4
  •   kgiannakakis    14 年前

    只要使用正确的内容类型,getjson就会为您将数据评估为json。确保服务器将数据作为application/json返回。

        4
  •  -1
  •   António Almeida Michal Drozd    6 年前
    $.each(JSON.parse(result), function(i, item) {
        alert(item.number);
    });