mysql 查询的 perl json 输出

标签 perl json

我正在尝试将 mysql 查询结果输出为 JSON 格式,但很难以我想要的格式输出数组。

我的sql表如下

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

我用于检索 mysql 行并解析为 json 的 Perl 代码如下

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]

最佳答案

#!/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(按类型顺序)是值。

关于mysql 查询的 perl json 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10185667/

相关文章:

linux - 如何在 perl 脚本中插入 awk 命令?

perl - 如何隐藏 Perl 代码?

perl - 哪个简单快速的UNIX命令可以打印最后一次出现的模式中的所有行?

javascript警报打印对象对象

javascript - 将数组转换为包含对象的数组

php - 数组中的值是字符串而不是整数

perl - 如何在 RedHat 上仅使用核心 Perl 打印变量及其值?

perl - 如何在控制区域设置的同时在 perl 中运行外部命令?

java - 将 JSON 参数从 java 发布到 sinatra 服务

javascript - 转换后的 JSON 数组选择