我怎么能迭代这个json?

时间:2014-02-20 11:14:48

标签: javascript jquery json loops

“这”是我从服务器检索的内容:

enter image description here

在jQuery中调用ajax之后

$.ajax({
    type: "POST",
    url: URL + "/webservices/WS.asmx/MyFunction",
    data: JSON.stringify({ "ID": ID }),
    contentType: 'application/json; charset=utf-8',
    success: function (json) {

    },
    error: function (jqxhr, text, error) {

    }
});

我希望迭代data(这是一个数组)中的项目。试过:

for (i in json.data) {
    var feed = json.data[i];
    console.log(feed.message);
}

但它什么都没打印。我哪里错了?

4 个答案:

答案 0 :(得分:2)

如果您显示的内容真的您在success方法中获得的内容,则您拥有一个包含JSON属性的对象d串。你可以像这样解析它:

success: function(response) {
    var data = $.parseJSON(response.d).data;
    // use the data, which is an array
}

根据您的评论:

  

但为什么我需要使用$ .parseJSON?不能只是用请求来管理它吗?例如dataType,但仍无效。

您不需要dataType,看起来服务器返回正确的MIME类型,因此jQuery已经正确处理第一级解析(反序列化)。

无论发送给你什么,数据似乎都是双重编码:首先它编码数组,然后创建一个对象并将数组作为data属性分配给它,将该对象序列化为JSON,然后将该字符串放在另一个对象的d属性上,并将其序列化。因此,虽然jQuery会自动为您处理第一个解析(反序列化)步骤,但它不知道第二个需要。我怀疑你可以在服务器级修复此问题;你可能想发一个单独的问题,询问如何做到这一点。


从您的进一步评论:

  

它从.NET Web服务方法返回。我打电话后从Facebook下载JSON。我将它存储在一个json变量中。然后我把它作为字符串返回。我认为webservice序列化已经序列化了json,对吗?

啊,这就是出了什么问题。您有三种选择:

  1. 继续做你正在做的事情并做上面明确的$.parseJSON电话。

  2. 在你的网络方法中做任何你需要做的事情,告诉你你要发回原始的JSON,它不应该对它进行编码;在这种情况下,jQuery会在您success收到它之前为您解析它,您可以放弃parseJSON来电。

  3. 解析您从Facebook获得的字符串,然后将结果数组放入您的Web方法返回的结构中。然后(再次)jQuery将为您解析它,您可以直接使用response.d.data而无需进一步解析。

答案 1 :(得分:0)

正如@ T.J.Crowder所指出的,你的问题与你在后端序列化数据的方式有关,这不是一个好的做法,将json作为字符串发送到一个真实的json对象中。

你应该这样做:

success: function (json) {
    var jsonObject = JSON.parse(json.d);
    //then iterate through it
    for(var i=0;i<jsonObject.data.length;i++){
        var feed = jsonObject.data[i];
        console.log(feed);
    }
},

关键是使用for(var key in jsonObject.data),在JavaScript中不安全,因为其他原型属性会显示在您的密钥中。

答案 2 :(得分:-1)

我假设json是一个不是字符串的对象,并且已经转换为json对象。还使用了json.d.data而不是json.data

使用for in for循环和打印Feed而不是feed.message:

for (var i in json.d.data) {
    var feed = json.d.data[i];
    console.log(feed);
}

因为我看不到{feed:{message:''}}

答案 3 :(得分:-1)

尝试使用

for (var i in json.d.data) {
    var feed = json.d.data[i];
    console.log(i+" "+feed);
}

,其中 i = Key & feed = value