“这”是我从服务器检索的内容:
在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);
}
但它什么都没打印。我哪里错了?
答案 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,对吗?
继续做你正在做的事情并做上面明确的$.parseJSON
电话。
在你的网络方法中做任何你需要做的事情,告诉你你要发回原始的JSON,它不应该对它进行编码;在这种情况下,jQuery会在您success
收到它之前为您解析它,您可以放弃parseJSON
来电。
解析您从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