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