Commit | Line | Data |
---|---|---|
d5424315 DG |
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 |