Если вы действительно не можете установить модуль JSON
, нетрудно написать простой кодер JSON самостоятельно:
sub to_json {
my $val = shift;
if (not defined $val) {
return "null";
} elsif (not ref $val) {
$val =~ s/([\0-\x1f\"\\])/sprintf "\\u%04x", ord $1/eg;
return '"' . $val . '"';
} elsif (ref $val eq 'ARRAY') {
return '[' . join(',', map to_json($_), @$val) . ']';
} elsif (ref $val eq 'HASH') {
return '{' . join(',', map to_json($_) . ":" . to_json($val->{$_}), sort keys %$val) . '}';
} else {
die "Cannot encode $val as JSON!\n";
}
}
print to_json($data);
Этот код закодирует undef
as null
, arrayrefs как JSON-массивы, hashrefs как JSON-объекты и все определили нереферентные скаляры как строки JSON.Он умрет, если встретится с чем-то еще;в частности, он не сопоставляет \1
и \0
с true
и false
, как это делает модуль JSON
, хотя при желании его легко добавить.
какальтернатива, Data::Dumper
может быть настроена на испускание чего-то, приближающего JSON, путем установки соответствующих опций:
use Data::Dumper ();
print Data::Dumper->new([ $data ])->Pair(':')->Terse(1)->Useqq(1)->Deepcopy(1)->Dump();
Однако результирующий вывод может быть не на 100% действительным JSON;в частности, даже с этими параметрами обработка Data::Dumper
undef
и строк, содержащих специальные или непечатаемые символы, не полностью соответствует спецификации JSON.