在this帖子中,我学会了如何在服务器端编码对象,现在我想在客户端解码它。
在客户端我做
$.ajax({
type: "GET",
url: "/cgi-bin/ajax_sort.pl",
contentType: "application/json; charset=utf-8",
dataType: "json",
data: { "column" : this.id },
error: function(XMLHttpRequest, textStatus, errorThrown) {
showError('responseText: ' + XMLHttpRequest.responseText);
showError('textStatus: ' + textStatus);
showError('errorThrown: ' + errorThrown);
},
success: function(result){
if (result.error) {
showError(result.error);
} else {
var obj = jQuery.parseJSON(result);
}
}
});
问题
obj
现在是否包含已解码的JSON数据?
如果是这样,该对象看起来像服务器端(从Perl的Data::Dumper
输出)
$VAR1 = {
'127' => {
'owners' => [
'm'
],
'users' => [
'hh',
'do'
],
'date_end' => '24/05-2011',
'title' => 'dfg',
'date_begin' => '24/05-2011',
'members_groups' => [],
'type' => 'individuel'
},
'276' => {
...
问题
obj
确实包含已解码的JSON,如何迭代对象?
答案 0 :(得分:5)
因为您指定了dataType: 'json'
,result
应该已经包含从HTTP响应中反序列化的Javascript对象。 $.parseJSON
应该是不必要的。
您可以使用$.each
:
success: function(result){
if (result.error) {
showError(result.error);
} else {
$.each(result, function(key, value) {
alert(value.title).
});
}
}
答案 1 :(得分:1)
result
已经是一个JSON对象 - 由jQuery解析,因为你已经指定了dataType: "json"
- 所以你不应该解析它。
要查看数据,您可以这样做:
for(key in result){
var curr = result[key];
//iterate over owners
for(var i = 0; i < curr.owners.length; i++){
alert(curr.owners[i]);
}
//iterate over users
for(var i = 0; i < curr.users.length; i++){
alert(curr.users[i]);
}
alert(curr.data_end);
alert(curr.title);
//and so on...
}
<强>更新强>
我一直在忘记$.each()
,如同在lonsomeday的回答中所示 - 你可能想要改用它。
答案 2 :(得分:1)
您必须将AJAX请求的数据类型声明为JSON。 jQuery会自动“解码”这个并从中创建一个对象。
您可以通过alert( result[127] );
答案 3 :(得分:1)
您可以使用for...in
迭代obj的成员。
for(var key in obj) {
var value = obj[key];
alert(key + "=" + value);
}
注意:您应该没有理由想要迭代JSON对象的成员。 JSON旨在作为一种序列化格式,其中双方(客户端和服务器)都知道其结构。如果你可以帮助传输什么数据,obj应该是最外层的数组。