Как зациклить результаты JSON в Perl - PullRequest
0 голосов
/ 23 ноября 2010

Я пытаюсь вывести JSON из сценария perl, который обращается к базе данных mysql.

Как мне перебрать результаты моего запроса и преобразовать их в 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 Ответ

3 голосов
/ 23 ноября 2010

Я думаю, что вы ищете это:

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 и все такое.:)

...