这是如何使用JSON的哈希?

San*_*ing 4 ajax perl jquery json

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

我之前尝试过使用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;
Run Code Online (Sandbox Code Playgroud)

这是将两个哈希值转换为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);

        }
        }
    });
    });
});
Run Code Online (Sandbox Code Playgroud)

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

以后如何访问数据?

使用Matt Ball和davorg回复更新更新的代码并添加alert(users).

现在的错误json是没有定义对象.

my $json->{"users"}  = \%user_result;
my $json->{"owners"} = \%owner_result;
Run Code Online (Sandbox Code Playgroud)

我该如何定义?

Dav*_*oss 5

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

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

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

这些修复实际上应该成功地将一些JSON返回到您的客户端代码.不过我还有其他一些建议.

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

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