1#!/usr/bin/perl 2 3BEGIN { pop @INC if $INC[-1] eq '.' } 4use strict; 5use Getopt::Long; 6 7use JSON::PP (); 8 9my $VERSION = '1.00'; 10 11# imported from JSON-XS/bin/json_xs 12 13my %allow_json_opt = map { $_ => 1 } qw( 14 ascii latin1 utf8 pretty indent space_before space_after relaxed canonical allow_nonref 15 allow_singlequote allow_barekey allow_bignum loose escape_slash 16); 17 18 19GetOptions( 20 'v' => \( my $opt_verbose ), 21 'f=s' => \( my $opt_from = 'json' ), 22 't=s' => \( my $opt_to = 'json' ), 23 'json_opt=s' => \( my $json_opt = 'pretty' ), 24 'V' => \( my $version ), 25) or die "Usage: $0 [-v] -f from_format [-t to_format]\n"; 26 27 28if ( $version ) { 29 print "$VERSION\n"; 30 exit; 31} 32 33 34$json_opt = '' if $json_opt eq '-'; 35 36my @json_opt = grep { $allow_json_opt{ $_ } or die "'$_' is invalid json opttion" } split/,/, $json_opt; 37 38my %F = ( 39 'json' => sub { 40 my $json = JSON::PP->new; 41 $json->$_() for @json_opt; 42 $json->decode( $_ ); 43 }, 44 'eval' => sub { 45 my $v = eval "no strict;\n#line 1 \"input\"\n$_"; 46 die "$@" if $@; 47 return $v; 48 }, 49); 50 51 52my %T = ( 53 'null' => sub { "" }, 54 'json' => sub { 55 my $json = JSON::PP->new; 56 $json->$_() for @json_opt; 57 $json->encode( $_ ); 58 }, 59 'dumper' => sub { 60 require Data::Dumper; 61 Data::Dumper::Dumper($_) 62 }, 63); 64 65 66 67$F{$opt_from} 68 or die "$opt_from: not a valid fromformat\n"; 69 70$T{$opt_to} 71 or die "$opt_from: not a valid toformat\n"; 72 73local $/; 74$_ = <STDIN>; 75 76$_ = $F{$opt_from}->(); 77$_ = $T{$opt_to}->(); 78 79print $_; 80 81 82__END__ 83 84=pod 85 86=encoding utf8 87 88=head1 NAME 89 90json_pp - JSON::PP command utility 91 92=head1 SYNOPSIS 93 94 json_pp [-v] [-f from_format] [-t to_format] [-json_opt options_to_json] 95 96=head1 DESCRIPTION 97 98json_pp converts between some input and output formats (one of them is JSON). 99This program was copied from L<json_xs> and modified. 100 101The default input format is json and the default output format is json with pretty option. 102 103=head1 OPTIONS 104 105=head2 -f 106 107 -f from_format 108 109Reads a data in the given format from STDIN. 110 111Format types: 112 113=over 114 115=item json 116 117as JSON 118 119=item eval 120 121as Perl code 122 123=back 124 125=head2 -t 126 127Writes a data in the given format to STDOUT. 128 129=over 130 131=item null 132 133no action. 134 135=item json 136 137as JSON 138 139=item dumper 140 141as Data::Dumper 142 143=back 144 145=head2 -json_opt 146 147options to JSON::PP 148 149Acceptable options are: 150 151 ascii latin1 utf8 pretty indent space_before space_after relaxed canonical allow_nonref 152 allow_singlequote allow_barekey allow_bignum loose escape_slash 153 154=head2 -v 155 156Verbose option, but currently no action in fact. 157 158=head2 -V 159 160Prints version and exits. 161 162 163=head1 EXAMPLES 164 165 $ perl -e'print q|{"foo":"あい","bar":1234567890000000000000000}|' |\ 166 json_pp -f json -t dumper -json_opt pretty,utf8,allow_bignum 167 168 $VAR1 = { 169 'bar' => bless( { 170 'value' => [ 171 '0000000', 172 '0000000', 173 '5678900', 174 '1234' 175 ], 176 'sign' => '+' 177 }, 'Math::BigInt' ), 178 'foo' => "\x{3042}\x{3044}" 179 }; 180 181 $ perl -e'print q|{"foo":"あい","bar":1234567890000000000000000}|' |\ 182 json_pp -f json -t dumper -json_opt pretty 183 184 $VAR1 = { 185 'bar' => '1234567890000000000000000', 186 'foo' => "\x{e3}\x{81}\x{82}\x{e3}\x{81}\x{84}" 187 }; 188 189=head1 SEE ALSO 190 191L<JSON::PP>, L<json_xs> 192 193=head1 AUTHOR 194 195Makamaka Hannyaharamitu, E<lt>makamaka[at]cpan.orgE<gt> 196 197 198=head1 COPYRIGHT AND LICENSE 199 200Copyright 2010 by Makamaka Hannyaharamitu 201 202This library is free software; you can redistribute it and/or modify 203it under the same terms as Perl itself. 204 205=cut 206 207