Changeset 2182

Show
Ignore:
Timestamp:
10/21/08 17:12:52 (3 months ago)
Author:
karpet
Message:
  • change to JSON::XS and make json default format in Aggregator::Object
  • add perl_to_xml() in Utils
Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • perl/SWISH-Prog/trunk/Changes

    r2139 r2182  
    67670.21    xxx 
    6868        * fix tests to skip correct numbers if swish-e not installed 
     69        * change to JSON::XS and make json default format in Aggregator::Object 
     70        * add perl_to_xml() in Utils 
    6971 
    7072 
  • perl/SWISH-Prog/trunk/Makefile.PL

    r2067 r2182  
    2727my %optional = ( 
    2828    'YAML::Syck'     => '0.72', 
     29    'JSON::XS'       => 2.2222, 
    2930    'Mail::Box'      => 0, 
    3031    'DBI'            => 0, 
  • perl/SWISH-Prog/trunk/lib/SWISH/Prog/Aggregator/Object.pm

    r2180 r2182  
    77use Carp; 
    88use YAML::Syck (); 
    9 use JSON::Syck (); 
     9use JSON::XS  (); 
    1010use SWISH::Prog::Utils; 
    1111use Scalar::Util qw( blessed ); 
     
    307307    else { 
    308308        if ( $self->serial_format eq 'json' ) { 
    309             return JSON::Syck::Dump($v); 
     309            return JSON::XS->new->convert_blessed(1)->allow_blessed(1) 
     310                ->encode($v); 
    310311        } 
    311312        elsif ( $self->serial_format eq 'yaml' ) { 
  • perl/SWISH-Prog/trunk/lib/SWISH/Prog/Utils.pm

    r2180 r2182  
    88use Search::Tools::XML; 
    99 
     10our $VERSION = '0.21'; 
     11 
    1012=pod 
    1113 
     
    4547=cut 
    4648 
    47 our $VERSION = '0.21'; 
    48 our $ExtRE   = qr{(html|htm|xml|txt|pdf|ps|doc|ppt|xls|mp3)(\.gz)?}io; 
    49 our $XML     = Search::Tools::XML->new; 
     49our $ExtRE = qr{(html|htm|xml|txt|pdf|ps|doc|ppt|xls|mp3)(\.gz)?}io; 
     50our $XML   = Search::Tools::XML->new; 
    5051 
    5152our %ParserTypes = ( 
     
    107108} 
    108109 
     110=head2 perl_to_xml( I<ref>, I<root_element> ) 
     111 
     112Similar to the XML::Simple XMLout() feature, perl_to_xml() 
     113will take a Perl data structure I<ref> and convert it to XML, 
     114using I<root_element> as the top-level element. 
     115 
     116=cut 
     117 
     118sub perl_to_xml { 
     119    my $self = shift; 
     120    my $perl = shift; 
     121    my $root = shift || '_root'; 
     122    unless ( defined $perl ) { 
     123        croak "perl data struct required"; 
     124    } 
     125 
     126    if ( !ref $perl ) { 
     127        return $XML->start_tag($root) 
     128            . $XML->utf8_safe($perl) 
     129            . $XML->end_tag($root); 
     130    } 
     131 
     132    my $xml = $XML->start_tag($root); 
     133    $self->_ref_to_xml( $perl, '', \$xml ); 
     134    $xml .= $XML->end_tag($root); 
     135    return $xml; 
     136} 
     137 
     138sub _ref_to_xml { 
     139    my ( $self, $perl, $root, $xml_ref ) = @_; 
     140    my $type = ref $perl; 
     141    if ( !$type ) { 
     142        $$xml_ref .= $XML->start_tag($root) if length($root); 
     143        $$xml_ref .= $XML->utf8_safe($perl); 
     144        $$xml_ref .= $XML->end_tag($root)   if length($root); 
     145        $$xml_ref .= "\n";    # just for debugging 
     146    } 
     147    elsif ( $type eq 'SCALAR' ) { 
     148        $self->_scalar_to_xml( $perl, $root, $xml_ref ); 
     149    } 
     150    elsif ( $type eq 'ARRAY' ) { 
     151        $self->_array_to_xml( $perl, $root, $xml_ref ); 
     152    } 
     153    elsif ( $type eq 'HASH' ) { 
     154        $self->_hash_to_xml( $perl, $root, $xml_ref ); 
     155    } 
     156    else { 
     157        croak "unsupported ref type: $type"; 
     158    } 
     159 
     160} 
     161 
     162sub _array_to_xml { 
     163    my ( $self, $perl, $root, $xml_ref ) = @_; 
     164    for my $thing (@$perl) { 
     165        if ( ref $thing and length($root) ) { 
     166            $$xml_ref .= $XML->start_tag($root); 
     167        } 
     168        $self->_ref_to_xml( $thing, $root, $xml_ref ); 
     169        if ( ref $thing and length($root) ) { 
     170            $$xml_ref .= $XML->end_tag($root); 
     171        } 
     172    } 
     173} 
     174 
     175sub _hash_to_xml { 
     176    my ( $self, $perl, $root, $xml_ref ) = @_; 
     177    for my $key ( keys %$perl ) { 
     178        my $thing = $perl->{$key}; 
     179        $self->_ref_to_xml( $thing, $key, $xml_ref ); 
     180    } 
     181} 
     182 
     183sub _scalar_to_xml { 
     184    my ( $self, $perl, $root, $xml_ref ) = @_; 
     185    $$xml_ref 
     186        .= $XML->start_tag($root) 
     187        . $XML->utf8_safe($$perl) 
     188        . $XML->end_tag($root); 
     189} 
     190 
    1091911; 
    110192