如何使用Perl打印JSON数据而不使用JSON模块?

时间:2011-10-17 12:06:41

标签: mysql json perl

我正在尝试为我在SourceForge上托管的词典项目编写自动完成功能。 不幸的是,SF上的Perl没有安装JSON模块。如何在不使用模块本身的情况下解决此问题?作为模特,我采用了JQuery UI automcomplete guide on jensbits

以下是应该查询文本并发送到自动完成模块的Perl代码

#!/usr/bin/perl
use strict;
use CGI;
use DBI;
use JSON;
# HTTP HEADER 
print "Content-type: application/json; charset=iso-8859-1\n\n";

my $dbh = DBI->connect("DBI:mysql:database;mysql_read_default_file=/path/.my.cnf");

$dbh->do("set character set utf8");
$dbh->do("set names utf8");

my ($p, $sth, @query_output); 

$p = new CGI;
my $term = $p->param('term');

$sth = $dbh->prepare(qq{SELECT trim(both char(13) FROM article) AS value, definition FROM dict WHERE article like ?;});
$sth->execute('%'.$term.'%');

# LOOP THROUGH RESULTS
while ( my $row = $sth->fetchrow_hashref ){
push @query_output, $row;
}
#CLOSE THE DATABASE CONNECTION
$dbh->disconnect()
# JSON OUTPUT
print JSON::to_json(\@query_output);

3 个答案:

答案 0 :(得分:7)

为什么不使用local::lib将文件安装到SourceForge上的用户目录中?

答案 1 :(得分:3)

据我所知,JSON包不需要安装在系统中。 你可以下载latest JSON distribution,解压缩,上传到你的主机,让Perl知道,在哪里抓取代码:只需添加

use lib '/absolute/path/to/JSON/lib';

use JSON;

如果您不知道绝对路径或想要使代码更具可移植性,可以使用FindBin包来查找相对于二进制文件的JSON发行版目录:

use FindBin
use lib "$FindBin::Bin/JSON/lib";

我希望这能解决你的问题。

答案 2 :(得分:3)

如果你真的无法安装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编码为null,将arrayrefs编码为JSON数组,将hashrefs编码为JSON对象,将所有定义的非参考标量编码为JSON字符串。如果遇到任何其他事情,它将会死亡;值得注意的是,它没有像\1模块那样将\0true映射到falseJSON,但如果需要,这很容易添加。


作为替代方案,可以通过设置适当的选项使Data::Dumper发出近似JSON的内容:

use Data::Dumper ();
print Data::Dumper->new([ $data ])->Pair(':')->Terse(1)->Useqq(1)->Deepcopy(1)->Dump();

但是,结果输出可能不是100%有效的JSON;特别是,即使使用这些选项,Data::Dumperundef和包含特殊或不可打印字符的字符串的处理也不完全符合JSON规范。