2012-04-17 106 views
2

我想输出mysql查询结果到JSON格式,但努力以我想要的格式输出数组。从MySQL查询perl json输出

我的SQL表如下

Array1,Type,Somevalue 
Record1,Type1,1 
Record1,Type2,2 
Record1,Type3,3 
Record2,Type1,4 
Record3,Type1,5 
Record3,Type3,6 

我的Perl代码以检索MySQL的行和解析成JSON低于

use DBD::Mysql; 
use JSON::XS; 
use IO::File; 
use warnings; 
use Data::Dumper::Names; 
use POSIX; 


my $json = JSON::XS->new->ascii->pretty->allow_nonref; 

my $datasource = "dbi:mysql:database=$dbname;host=$host;port=$port"; 
#PERL DBI CONNECT 
my $dbh =DBI->connect($datasource, $dbusername, $dbpasswd) || die "Could not connect to database: $DBI::errstr"; 
#PREPARE THE QUERY 
my $query1=qq(select * from table); 

my $query_handle1 = $dbh->prepare($query1); 

#EXECUTE THE QUERY 
$query_handle1->execute(); 

#my variable 
my $i; 

my @Types = ("Type1","Type2","Type3"); 
my @Array1 = ("Record1","Record2","Record3","Record4"); 
my @sql_query_1_Results; 

#LOOP THROUGH RESULTS and store results for later processing 
while(my $row = $query_handle1->fetchrow_hashref) { 
push @sql_query_1_Results, $row; 
} 

# create data arrays for record we should get 3 arrays with values 
for ($i=0;$i<=$#sql_query_1_Results;$i++) 
{ 
push @{$sql_query_1_Results[$i]->{record}},$sql_query_1_Results[$i]->{Some_Value}; 
} 

foreach my $record(@Array1){ 
$json = encode_json({ 'name' => $record, 'data'=> \@{$record} }); 
push @chart1_data, $json; 
} 
#DISCONNECT FROM THE DATABASE 
$dbh->disconnect(); 

#JSON OUTPUT 
my $chart1_data_json=encode_json({ chart1 => \@chart1_data }); 
print $chart1_data_json; 

上面的代码给我阵列如下

Record1=[1,2,3] 
Record2=[4] 
Record3=[5,6] 

但我想维护类型的顺序,即以下面的格式

Record1=[1,2,3] 
Record2=[4,0,0] 
Record3=[5,0,6] 
+1

总是'使用严格;'和'使用警告;'。切勿直接包含'DBD :: *'模块。相反'使用DBI;'。 – dgw 2012-04-17 07:50:26

+0

@dgw Tks。我通常包括警告,但将包括严格和使用DBI.Can你请告诉如何获得有序数组的? – Linus 2012-04-17 08:31:19

回答

2
#!/usr/bin/perl 

use strict ; 
use warnings; 
use DBI; 
use JSON::XS; 
use IO::File; 
use Data::Dumper::Names; 
use POSIX; 

my $json = JSON::XS->new->ascii->pretty->allow_nonref; 

my ($dbname , $host , $port , $dbusername , $dbpasswd) ; # Satisfy strict 

my $datasource = "dbi:mysql:database=$dbname;host=$host;port=$port"; 
#PERL DBI CONNECT 
my $dbh =DBI->connect($datasource, $dbusername, $dbpasswd) || die "Could not connect to database: $DBI::errstr"; 
#PREPARE THE QUERY 
my $query1=qq(select * from table); 

my $query_handle1 = $dbh->prepare($query1); 

#EXECUTE THE QUERY 
$query_handle1->execute(); 

my @Types = ("Type1","Type2","Type3"); 
my @Array1 = ("Record1","Record2","Record3","Record4"); 

# BEGIN modified data munching 
my %result ; 
my %Type_Pos ; 
@Type_Pos{@Types} = (0 .. $#Types) ; # Map the type to position 

while(my $row = $query_handle1->fetchrow_hashref) { 
    if(! exists $result{$row->{Array1}}) { 
    # Initialize Record with all possible types 
    $result{$row->{Array1}} = [ map { 0 } @Types ] ; 
    } 
    $result{$row->{Array1}}->[$Type_Pos{$row->{Type}}] = $row->{Somevalue} ; 
} 

my @chart1_data = map { encode_json({ 'name' => $_, 'data'=> $result{$_} }) 
         } sort keys %result ; 
# END modified data munching 

$dbh->disconnect(); 

#JSON OUTPUT 
my $chart1_data_json=encode_json({ chart1 => \@chart1_data }); 
print $chart1_data_json; 

这应该做你的要求。
而不是将数据保存在数组中我构造了一个散列,其中记录是关键字,Somevalue的arrayref(按类型排序)是值。

+0

感谢您的帮助。 while循环中有很少的语法错误。我厌倦了修复如下,但没有看到数组中的值。你能看看吗? while(my $ row = $ query_handle1-> fetchrow_hashref){ if(!exists $ result {$ row - > {Array1}}){0}初始化所有可能类型的记录 $ result {$ row - > {Array1 }} = [map {0} @Types]; } $ result {$ row - > {Array1} - > [$ Type_Pos {$ row - > {Type}}]} = $ row - > {Somevalue}; } – Linus 2012-04-17 10:00:54

+0

@Linus你是对的,总是同样的错误......现在纠正。 – dgw 2012-04-17 10:18:08

+0

感谢您的帮助。我仍然不清楚声明“if(!exists $ result {$ row - > {Array1}})”是否意味着检查该行是否包含Array1中的任何元素?你也可以解释“$ result {$ row - > {Array1}} = [map {0} @Types]” – Linus 2012-04-17 11:17:32