1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
|
package Data::Stag::JSONWriter;
=head1 NAME
Data::Stag::JSONWriter - writes stag events into JSON files
=head1 SYNOPSIS
=cut
=head1 DESCRIPTION
=head1 PUBLIC METHODS -
=cut
use strict;
use base qw(Data::Stag::Writer);
use Data::Stag::Util qw(rearrange);
use JSON;
use vars qw($VERSION);
$VERSION="0.14";
sub fmtstr {
return 'json';
}
sub end_stag {
my $self = shift;
my $stag = shift;
my $obj = $self->stag2json($stag);
my $json = JSON->new->allow_nonref;
my $json_text = $json->pretty->encode( $obj );
$self->addtext($json_text);
return;
}
sub stag2json {
my $self = shift;
my $stag = shift;
my $obj = {};
if ($stag->isterminal) {
return $stag->data;
}
else {
my @nodes = $stag->subnodes;
foreach my $n (@nodes) {
my $v = $self->stag2json($n);
if ($obj->{$n->name}) {
if (ref($obj->{$n->name}) eq 'ARRAY') {
push(@{$obj->{$n->name}}, $v);
}
else {
$obj->{$n->name} = [$obj->{$n->name}, $v];
}
}
else {
# first
$obj->{$n->name} = $v;
}
}
}
return $obj;
}
1;
|