如何在Perl中循环json结果

时间:2010-11-22 22:29:48

标签: perl json dbi

我正在尝试从访问mysql数据库的perl脚本输出JSON。

如何循环查询返回并使用JSON模块将其转换为JSON?

当我这样做时,我得到的是1回归

while($query_handle->fetch()) {
    $jsonStructure->{event};
    $jsonStructure->{event}->{evid} = $evid;
    $jsonStructure->{event}->{component} = $component;
    $jsonStructure->{event}->{firstTime} = $firstTime;
    $jsonStructure->{event}->{lastTime} = $lastTime;
    $jsonStructure->{event}->{count} = $count;
    $jsonStructure->{event}->{summary} = $summary;
    $jsonStructure->{event}->{severity} = $severity;
} 

基本上我有很多事件,不知道如何说事件[0] ......

谢谢

1 个答案:

答案 0 :(得分:3)

我认为您正在寻找的是:

push @{ $jsonStructure->{events} }, {
    evid => $evid,
    component => $component,
    ...,
};

虽然这甚至可能有点过分,因为你可能会做类似的事情:

while (my $row = $dbh->fetchrow_hashref) {
  push @{ $jsonStructure->{events} }, $row;
}

如果数据库中的所有列名都与JSON中所需的字段名相同,并且您想要所有列,或者:

my @keys = qw(evid component firstTime ...);

while (my $row = $dbh->fetchrow_hashref) {
  my %hash;
  @hash{@keys} = @$row{@keys};
  push @{ $jsonStructure->{events} }, \%hash;
}

如果您只想要一些列,或者:

# DB colname => JSON field name
my %mapping = (
  event_id => 'evid',
  component => 'component',
  first_time => 'firstTime',
  ...,
);

while (my $row = $dbh->fetchrow_hashref) {
  my %hash;
  @hash{ values %mapping } = @$row{ keys %mapping };
  push @{ $jsonStructure->{events} }, \%hash;
}

用于完全任意的映射。 Perl的力量和所有这些。 :)