如何解码JSON对象并迭代它?

时间:2011-06-06 22:06:59

标签: javascript jquery ajax json

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,如何迭代对象?

4 个答案:

答案 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应该是最外层的数组。