我正在创建一个网页,其中有两个表单(用户和所有者),其中一个可以在每个表单中键入以逗号分隔的名称,然后点击提交。
我之前尝试过使用JSON,而不使用Perl模块。现在,我需要以username, full name
和owner_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;
我该如何定义?
答案 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,所以我无法帮助你。