这是我的代码
#!/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 $json = JSON->new;
$json = $json->utf8;
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};
}
$json->{"users"} = $json->encode(\%user_result);
$json->{"owners"} = $json->encode(\%owner_result);
$json_string = to_json($json);
print $cgi->header(-type => "application/json", -charset => "utf-8");
print $json_string;
和这些行
$json->{"users"} = $json->encode(\%user_result);
$json->{"owners"} = $json->encode(\%owner_result);
给出错误
Not a HASH reference
为什么我会得到那个?
如何解决?
最佳答案
JSON
对象(至少在 XS 版本中,见下文)只是一个 SCALAR 引用,因此您不能对其执行哈希引用操作。实际上,您遇到的大多数 Perl 对象都是散列引用,但情况并非总是如此。
我不确定您试图通过使用 JSON 对 JSON 对象进行编码来完成什么。您需要对 JSON 对象的内部进行编码吗?或者您只需要序列化用户和所有者数据?在后一种情况下,您应该只使用一个新的哈希引用来保存该数据并传递给 JSON。如果您确实需要对 JSON 对象进行编码,那么使用 JSON::PP
(JSON 模块的“纯 Perl”变体)可能会好一些,它确实使用哈希引用。
关于perl - 为什么会出现此错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6020142/