4 use warnings FATAL => 'all';
12 our $VERSION = '1.003000';
14 sub _choose_json_module {
15 return 'Cpanel::JSON::XS' if $INC{'Cpanel/JSON/XS.pm'};
16 return 'JSON::XS' if $INC{'JSON/XS.pm'};
20 return 'Cpanel::JSON::XS' if eval { require Cpanel::JSON::XS; 1; };
21 push @err, "Error loading Cpanel::JSON::XS: $@";
23 return 'JSON::XS' if eval { require JSON::XS; 1; };
24 push @err, "Error loading JSON::XS: $@";
26 return 'JSON::PP' if eval { require JSON::PP; 1 };
27 push @err, "Error loading JSON::PP: $@";
29 die join( "\n", "Couldn't load a JSON module:", @err );
34 our $JSON_Class = _choose_json_module();
35 $JSON_Class->import(qw(encode_json decode_json));
38 our @EXPORT = qw(encode_json decode_json JSON);
39 our @EXPORT_ALL = qw/is_bool/;
40 our @EXPORT_OK = qw(is_bool to_json from_json);
41 our %EXPORT_TAGS = ( all => [ @EXPORT, @EXPORT_ALL ],
42 legacy => [ @EXPORT, @EXPORT_OK],
46 sub JSON () { our $JSON_Class }
50 my %args = @_ == 1 ? %{$_[0]} : @_;
51 my $new = (our $JSON_Class)->new;
52 $new->$_($args{$_}) for keys %args;
59 die 'is_bool is not a method' if $_[1];
61 Scalar::Util::blessed($_[0])
62 and ($_[0]->isa('JSON::XS::Boolean')
63 or $_[0]->isa('JSON::PP::Boolean'));
66 # CopyPasta from JSON.pm version 2.90
69 if ( ref($_[0]) eq 'JSON' or $_[0] eq 'JSON' ) {
70 Carp::croak "from_json should not be called as a method.";
74 if (@_ == 2 and ref $_[1] eq 'HASH') {
76 for my $method (keys %$opt) {
77 $json->$method( $opt->{$method} );
81 return $json->decode( $_[0] );
87 or (@_ > 2 and $_[0] eq 'JSON')
89 Carp::croak "to_json should not be called as a method.";
93 if (@_ == 2 and ref $_[1] eq 'HASH') {
95 for my $method (keys %$opt) {
96 $json->$method( $opt->{$method} );
100 $json->encode($_[0]);
110 JSON::MaybeXS - Use L<Cpanel::JSON::XS> with a fallback to L<JSON::XS> and L<JSON::PP>
116 my $data_structure = decode_json($json_input);
118 my $json_output = encode_json($data_structure);
120 my $json = JSON->new;
122 my $json_with_args = JSON::MaybeXS->new(utf8 => 1); # or { utf8 => 1 }
126 This module first checks to see if either L<Cpanel::JSON::XS> or
127 L<JSON::XS> is already loaded, in which case it uses that module. Otherwise
128 it tries to load L<Cpanel::JSON::XS>, then L<JSON::XS>, then L<JSON::PP>
129 in order, and either uses the first module it finds or throws an error.
131 It then exports the C<encode_json> and C<decode_json> functions from the
132 loaded module, along with a C<JSON> constant that returns the class name
133 for calling C<new> on.
135 If you're writing fresh code rather than replacing L<JSON.pm|JSON> usage, you might
136 want to pass options as constructor args rather than calling mutators, so
137 we provide our own C<new> method that supports that.
141 C<encode_json>, C<decode_json> and C<JSON> are exported by default; C<is_bool>
142 is exported on request.
144 To import only some symbols, specify them on the C<use> line:
146 use JSON::MaybeXS qw(encode_json decode_json is_bool); # functions only
148 use JSON::MaybeXS qw(JSON); # JSON constant only
150 To import all available sensible (encode_json, decode_json and
151 is_bool) symbols, use C<:all>:
153 use JSON::MaybeXS ':all';
155 To import all symbols including those needed by legacy apps that use JSON::PP:
157 use JSON::MaybeXS ':legacy';
159 This imports to_json and from_json symbols as well as everything in
160 C< :all >. NOTE: This is to support legacy code that makes extensive
161 use of to_json and from_json which you are not yet in a position to
162 refactor. DO NOT use this import tag in new code, in order to avoid
163 the crawling horrors of getting UTF8 support subtly wrong. See the
164 documentation for L<JSON> for further details.
168 This is the C<encode_json> function provided by the selected implementation
169 module, and takes a perl data structure which is serialised to JSON text.
171 my $json_text = encode_json($data_structure);
175 This is the C<decode_json> function provided by the selected implementation
176 module, and takes a string of JSON text to deserialise to a perl data structure.
178 my $data_structure = decode_json($json_text);
180 =head2 to_json, from_json
182 See L< JSON > for details. These are included to support legacy code
187 The C<JSON> constant returns the selected implementation module's name for
188 use as a class name - so:
190 my $json_obj = JSON->new; # returns a Cpanel::JSON::XS or JSON::PP object
192 and that object can then be used normally:
194 my $data_structure = $json_obj->decode($json_text); # etc.
198 $is_boolean = is_bool($scalar)
200 Returns true if the passed scalar represents either C<true> or
201 C<false>, two constants that act like C<1> and C<0>, respectively
202 and are used to represent JSON C<true> and C<false> values in Perl.
204 Since this is a bare sub in the various backend classes, it cannot be called as
205 a class method like the other interfaces; it must be called as a function, with
206 no invocant. It supports the representation used in all JSON backends.
212 With L<JSON::PP>, L<JSON::XS> and L<Cpanel::JSON::XS> you are required to call
213 mutators to set options, such as:
215 my $json = $class->new->utf8(1)->pretty(1);
217 Since this is a trifle irritating and noticeably un-perlish, we also offer:
219 my $json = JSON::MaybeXS->new(utf8 => 1, pretty => 1);
221 which works equivalently to the above (and in the usual tradition will accept
222 a hashref instead of a hash, should you so desire).
226 To include JSON-aware booleans (C<true>, C<false>) in your data, just do:
229 my $true = JSON->true;
230 my $false = JSON->false;
234 mst - Matt S. Trout (cpan:MSTROUT) <mst@shadowcat.co.uk>
240 =item * Clinton Gormley <drtech@cpan.org>
242 =item * Karen Etheridge <ether@cpan.org>
248 Copyright (c) 2013 the C<JSON::MaybeXS> L</AUTHOR> and L</CONTRIBUTORS>
253 This library is free software and may be distributed under the same terms