如何解码JSON对象并对其进行迭代

How to decode JSON object and iterate over it?

本文关键字:迭代 对象 JSON 何解码 解码      更新时间:2023-09-26

在这篇文章中,我学习了如何在服务器端对对象进行编码,现在我想在客户端对其进行解码。

在客户端,我做

$.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吗?我如何迭代对象?

因为指定了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).
        });
    }
}

result已经是一个JSON对象-由于您已经指定了dataType: "json",所以jQuery会解析它-所以您不应该解析它。

要查看数据,您可以这样做:

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()的问题,正如lononey的回答所示——你可能想改为使用它。

您可以使用for...in迭代obj的成员。

for(var key in obj) {
    var value = obj[key];
    alert(key + "=" + value);
}

注意:应该没有什么理由需要对JSON对象的成员进行迭代。JSON是一种序列化格式,双方(客户端和服务器)都知道它的结构。如果您能帮助传输什么数据,obj应该是一个位于其最外部范围的数组。

您必须将AJAX请求的数据类型声明为JSON。jQuery将自动对其进行"解码",并从中创建一个对象

您可以立即通过alert( result[127] ); 访问数据