这是如何使用JSON的哈希?

时间:2011-05-16 13:37:55

标签: jquery ajax perl json

我正在创建一个网页,其中有两个表单(用户和所有者),其中一个可以在每个表单中键入以逗号分隔的名称,然后点击提交。

我之前尝试过使用JSON,而不使用Perl模块。现在,我需要以username, full nameowner_name, full name的形式为许多用户传输信息。在Perl中我将它作为两个哈希值。

这是一个两部分问题。

服务器端

这是我的Perl脚本。

#!/usr/bin/perl -T

use CGI;
use CGI::Carp qw(fatalsToBrowser);
use CGI qw(:standard);
use JSON;
use utf8;
use strict;
use warnings;

my $cgi = CGI->new;
$cgi->charset('UTF-8');

my @owners = map { s/\s*//g; $_ } split ",", $cgi->param('owner');
my @users  = map { s/\s*//g; $_ } split ",", $cgi->param('users');

# ...

my %user_result = ();
foreach my $u (@users) {
    $user_result{$u} = $db1->{$u}{displayName};
}

my %owner_result = ();
foreach my $o (@owners) {
    $owner_result{$o} = $db2{$o}{ad_displayname};
}

my $json->{"users"}  = \%user_result;
my $json->{"owners"} = \%owner_result;

my $json_string = to_json($json);

print $cgi->header(-type => "application/json", -charset => "utf-8");
print $json_string;

这是将两个哈希值转换为JSON字符串的正确方法吗?

客户端

$(document).ready(function(){
    $('form').live('submit', function(){
    $.ajax({
        type: "GET",
        url: "/cgi-bin/ajax.pl",
        contentType: "application/json; charset=utf-8",
        dataType: "json",

        data: $(this).serialize(),

        error: function(XMLHttpRequest, textStatus, errorThrown) { 
        $('div#create_result').text("responseText: " + XMLHttpRequest.responseText +
                        ", textStatus: " + textStatus +
                        ", errorThrown: " + errorThrown);
        $('div#create_result').addClass("error");
        },

        success: function(result){
        if (result.error) {
            $('div#create_result').text("result.error: " + result.error);
            $('div#create_result').addClass("error");
        } else { // perl script says everything is okay

              // how do I access my two hashes here?
              // {"users": [username1, fullname1, ...], "owners": [owner name1, full name 1, ...]}

              var users  = result.users;    // array
              var owners = result.owners;   // array
              alert(users);
              alert(owners);

        }
        }
    });
    });
});

这是发送和接收JSON的正确方法吗?

之后我如何访问数据?

更新 使用Matt Ball和davorg答案更新了代码并添加了alert(users)

现在的错误是未定义json对象。

my $json->{"users"}  = \%user_result;
my $json->{"owners"} = \%owner_result;

我该如何定义?

2 个答案:

答案 0 :(得分:5)

您正在尝试打印两个CGI标头块。不幸的是,您只能在每个响应中关联一个CGI块。而且,不幸的是,您打印的第一个标题块具有错误的内容类型标题(它是'text / html',您实际上需要'application / json')。

如果删除'print'内容类型:...“'行,事情应该会好一点。

然后在第二个标题栏中,您尝试调用名为“标题”的未知函数。这实际上是你的$ cgi对象的一个​​方法,所以它需要被称为$ cgi-> header(...)。

这些修补程序实际上应该成功地将一些JSON返回到您的客户端代码。我会提出其他一些建议。

1 /'split'函数的第一个参数应该是正则表达式,而不是字符串。

2 /您正在构建的JSON数据结构似乎不必要地复杂。对于您的两个部分(用户和所有者)中的每一部分,您都有一个元素数组,其中包含对哈希的引用。当然可以省略数组,因此每个元素只是直接包含哈希引用。

答案 1 :(得分:4)

使用dataType: 'json',jQuery将自动为您解析JSON结果。这意味着传递给result回调的success值已经是一个合适的JavaScript对象。您可以像访问任何其他JS对象一样访问其值。例如,如果Perl脚本返回此JSON:

{"foo": "a", "bar": 42, "baz": [true, false]}

然后您可以访问success回调中的各个字段,如下所示:

success: function(result) {
    var foo = result.foo,    // 'a'
        bar = result.bar,    // 42
        baz = result.baz;    // [true, false]
}

如果在响应标头中设置Content-Type: application/json(在Perl中),您甚至不需要 dataType: 'json',因为jQuery可以从HTTP {{{{}嗅探数据类型1}}标题。

我不知道Perl,所以我无法帮助你。