HEX
Server: Apache
System: Linux s198.coreserver.jp 5.15.0-151-generic #161-Ubuntu SMP Tue Jul 22 14:25:40 UTC 2025 x86_64
User: nagasaki (10062)
PHP: 7.1.33
Disabled: NONE
Upload Files
File: //usr/local/share/man/man3/JSON::MaybeXS.3pm
.\" Automatically generated by Pod::Man 4.11 (Pod::Simple 3.35)
.\"
.\" Standard preamble:
.\" ========================================================================
.de Sp \" Vertical space (when we can't use .PP)
.if t .sp .5v
.if n .sp
..
.de Vb \" Begin verbatim text
.ft CW
.nf
.ne \\$1
..
.de Ve \" End verbatim text
.ft R
.fi
..
.\" Set up some character translations and predefined strings.  \*(-- will
.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
.\" nothing in troff, for use with C<>.
.tr \(*W-
.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
.ie n \{\
.    ds -- \(*W-
.    ds PI pi
.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
.    ds L" ""
.    ds R" ""
.    ds C` ""
.    ds C' ""
'br\}
.el\{\
.    ds -- \|\(em\|
.    ds PI \(*p
.    ds L" ``
.    ds R" ''
.    ds C`
.    ds C'
'br\}
.\"
.\" Escape single quotes in literal strings from groff's Unicode transform.
.ie \n(.g .ds Aq \(aq
.el       .ds Aq '
.\"
.\" If the F register is >0, we'll generate index entries on stderr for
.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
.\" entries marked with X<> in POD.  Of course, you'll have to process the
.\" output yourself in some meaningful fashion.
.\"
.\" Avoid warning from groff about undefined register 'F'.
.de IX
..
.nr rF 0
.if \n(.g .if rF .nr rF 1
.if (\n(rF:(\n(.g==0)) \{\
.    if \nF \{\
.        de IX
.        tm Index:\\$1\t\\n%\t"\\$2"
..
.        if !\nF==2 \{\
.            nr % 0
.            nr F 2
.        \}
.    \}
.\}
.rr rF
.\" ========================================================================
.\"
.IX Title "JSON::MaybeXS 3"
.TH JSON::MaybeXS 3 "2020-11-13" "perl v5.26.3" "User Contributed Perl Documentation"
.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
.nh
.SH "NAME"
JSON::MaybeXS \- Use Cpanel::JSON::XS with a fallback to JSON::XS and JSON::PP
.SH "SYNOPSIS"
.IX Header "SYNOPSIS"
.Vb 1
\&  use JSON::MaybeXS;
\&
\&  my $data_structure = decode_json($json_input);
\&
\&  my $json_output = encode_json($data_structure);
\&
\&  my $json = JSON()\->new;
\&
\&  my $json_with_args = JSON::MaybeXS\->new(utf8 => 1); # or { utf8 => 1 }
.Ve
.SH "DESCRIPTION"
.IX Header "DESCRIPTION"
This module first checks to see if either Cpanel::JSON::XS or
\&\s-1JSON::XS\s0 (at at least version 3.0)
is already loaded, in which case it uses that module. Otherwise
it tries to load Cpanel::JSON::XS, then \s-1JSON::XS\s0, then \s-1JSON::PP\s0
in order, and either uses the first module it finds or throws an error.
.PP
It then exports the \f(CW\*(C`encode_json\*(C'\fR and \f(CW\*(C`decode_json\*(C'\fR functions from the
loaded module, along with a \f(CW\*(C`JSON\*(C'\fR constant that returns the class name
for calling \f(CW\*(C`new\*(C'\fR on.
.PP
If you're writing fresh code rather than replacing \s-1JSON\s0.pm usage, you might
want to pass options as constructor args rather than calling mutators, so
we provide our own \f(CW\*(C`new\*(C'\fR method that supports that.
.SH "EXPORTS"
.IX Header "EXPORTS"
\&\f(CW\*(C`encode_json\*(C'\fR, \f(CW\*(C`decode_json\*(C'\fR and \f(CW\*(C`JSON\*(C'\fR are exported by default; \f(CW\*(C`is_bool\*(C'\fR
is exported on request.
.PP
To import only some symbols, specify them on the \f(CW\*(C`use\*(C'\fR line:
.PP
.Vb 1
\&  use JSON::MaybeXS qw(encode_json decode_json is_bool); # functions only
\&
\&  use JSON::MaybeXS qw(JSON); # JSON constant only
.Ve
.PP
To import all available sensible symbols (\f(CW\*(C`encode_json\*(C'\fR, \f(CW\*(C`decode_json\*(C'\fR, and
\&\f(CW\*(C`is_bool\*(C'\fR), use \f(CW\*(C`:all\*(C'\fR:
.PP
.Vb 1
\&  use JSON::MaybeXS \*(Aq:all\*(Aq;
.Ve
.PP
To import all symbols including those needed by legacy apps that use \s-1JSON::PP\s0:
.PP
.Vb 1
\&  use JSON::MaybeXS \*(Aq:legacy\*(Aq;
.Ve
.PP
This imports the \f(CW\*(C`to_json\*(C'\fR and \f(CW\*(C`from_json\*(C'\fR symbols as well as everything in
\&\f(CW\*(C`:all\*(C'\fR.  \s-1NOTE:\s0 This is to support legacy code that makes extensive
use of \f(CW\*(C`to_json\*(C'\fR and \f(CW\*(C`from_json\*(C'\fR which you are not yet in a position to
refactor.  \s-1DO NOT\s0 use this import tag in new code, in order to avoid
the crawling horrors of getting \s-1UTF\-8\s0 support subtly wrong.  See the
documentation for \s-1JSON\s0 for further details.
.SS "encode_json"
.IX Subsection "encode_json"
This is the \f(CW\*(C`encode_json\*(C'\fR function provided by the selected implementation
module, and takes a perl data structure which is serialised to \s-1JSON\s0 text.
.PP
.Vb 1
\&  my $json_text = encode_json($data_structure);
.Ve
.SS "decode_json"
.IX Subsection "decode_json"
This is the \f(CW\*(C`decode_json\*(C'\fR function provided by the selected implementation
module, and takes a string of \s-1JSON\s0 text to deserialise to a perl data structure.
.PP
.Vb 1
\&  my $data_structure = decode_json($json_text);
.Ve
.SS "to_json, from_json"
.IX Subsection "to_json, from_json"
See \s-1JSON\s0 for details.  These are included to support legacy code
\&\fBonly\fR.
.SS "\s-1JSON\s0"
.IX Subsection "JSON"
The \f(CW\*(C`JSON\*(C'\fR constant returns the selected implementation module's name for
use as a class name \- so:
.PP
.Vb 1
\&  my $json_obj = JSON()\->new; # returns a Cpanel::JSON::XS or JSON::PP object
.Ve
.PP
and that object can then be used normally:
.PP
.Vb 1
\&  my $data_structure = $json_obj\->decode($json_text); # etc.
.Ve
.PP
The use of parentheses here is optional, and only used as a hint to the reader
that this use of \f(CW\*(C`JSON\*(C'\fR is a \fIsubroutine\fR call, \fInot\fR a class name.
.SS "is_bool"
.IX Subsection "is_bool"
.Vb 1
\&  $is_boolean = is_bool($scalar)
.Ve
.PP
Returns true if the passed scalar represents either \f(CW\*(C`true\*(C'\fR or
\&\f(CW\*(C`false\*(C'\fR, two constants that act like \f(CW1\fR and \f(CW0\fR, respectively
and are used to represent \s-1JSON\s0 \f(CW\*(C`true\*(C'\fR and \f(CW\*(C`false\*(C'\fR values in Perl.
.PP
Since this is a bare sub in the various backend classes, it cannot be called as
a class method like the other interfaces; it must be called as a function, with
no invocant.  It supports the representation used in all \s-1JSON\s0 backends.
.PP
Available since version 1.002004.
.SH "CONSTRUCTOR"
.IX Header "CONSTRUCTOR"
.SS "new"
.IX Subsection "new"
With \s-1JSON::PP\s0, \s-1JSON::XS\s0 and Cpanel::JSON::XS you are required to call
mutators to set options, such as:
.PP
.Vb 1
\&  my $json = $class\->new\->utf8(1)\->pretty(1);
.Ve
.PP
Since this is a trifle irritating and noticeably un-perlish, we also offer:
.PP
.Vb 1
\&  my $json = JSON::MaybeXS\->new(utf8 => 1, pretty => 1);
.Ve
.PP
which works equivalently to the above (and in the usual tradition will accept
a hashref instead of a hash, should you so desire).
.PP
The resulting object is blessed into the underlying backend, which offers (at
least) the methods \f(CW\*(C`encode\*(C'\fR and \f(CW\*(C`decode\*(C'\fR.
.SH "BOOLEANS"
.IX Header "BOOLEANS"
To include JSON-aware booleans (\f(CW\*(C`true\*(C'\fR, \f(CW\*(C`false\*(C'\fR) in your data, just do:
.PP
.Vb 3
\&    use JSON::MaybeXS;
\&    my $true = JSON()\->true;
\&    my $false = JSON()\->false;
.Ve
.PP
The booleans are also available as subs or methods on JSON::MaybeXS.
.PP
.Vb 5
\&    use JSON::MaybeXS ();
\&    my $true = JSON::MaybeXS::true;
\&    my $true = JSON::MaybeXS\->true;
\&    my $false = JSON::MaybeXS::false;
\&    my $false = JSON::MaybeXS\->false;
.Ve
.SH "CONVERTING FROM JSON::Any"
.IX Header "CONVERTING FROM JSON::Any"
JSON::Any used to be the favoured compatibility layer above the various
\&\s-1JSON\s0 backends, but over time has grown a lot of extra code to deal with legacy
backends (e.g. JSON::Syck) that are no longer needed.  This is a rough guide of translating such code:
.PP
Change code from:
.PP
.Vb 2
\&    use JSON::Any;
\&    my $json = JSON::Any\->new\->objToJson($data);    # or to_json($data), or Dump($data)
.Ve
.PP
to:
.PP
.Vb 2
\&    use JSON::MaybeXS;
\&    my $json = encode_json($data);
.Ve
.PP
Change code from:
.PP
.Vb 2
\&    use JSON::Any;
\&    my $data = JSON::Any\->new\->jsonToObj($json);    # or from_json($json), or Load($json)
.Ve
.PP
to:
.PP
.Vb 2
\&    use JSON::MaybeXS;
\&    my $json = decode_json($data);
.Ve
.SH "CAVEATS"
.IX Header "CAVEATS"
The \f(CW\*(C`new()\*(C'\fR method in this module is technically a factory, not a
constructor, because the objects it returns will \fI\s-1NOT\s0\fR be blessed into the
\&\f(CW\*(C`JSON::MaybeXS\*(C'\fR class.
.PP
If you are using an object returned by this module as a Moo(se) attribute,
this type constraint code:
.PP
.Vb 1
\&    is \*(Aqjson\*(Aq => ( isa => \*(AqJSON::MaybeXS\*(Aq );
.Ve
.PP
will \fI\s-1NOT\s0\fR do what you expect. Instead, either rely on the \f(CW\*(C`JSON\*(C'\fR class
constant described above, as so:
.PP
.Vb 1
\&    is \*(Aqjson\*(Aq => ( isa => JSON::MaybeXS::JSON() );
.Ve
.PP
Alternatively, you can use duck typing:
.PP
.Vb 2
\&    use Moose::Util::TypeConstraints \*(Aqduck_type\*(Aq;
\&    is \*(Aqjson\*(Aq => ( isa => Object , duck_type([qw/ encode decode /]));
.Ve
.SH "INSTALLATION"
.IX Header "INSTALLATION"
At installation time, \fIMakefile.PL\fR will attempt to determine if you have a
working compiler available, and therefore whether you are able to run \s-1XS\s0 code.
If so, Cpanel::JSON::XS will be added to the prerequisite list, unless
\&\s-1JSON::XS\s0 is already installed at a high enough version. \s-1JSON::XS\s0 may
also be upgraded to fix any incompatibility issues.
.PP
Because running \s-1XS\s0 code is not mandatory and \s-1JSON::PP\s0 (which is in perl
core) is used as a fallback backend, this module is safe to be used in a suite
of code that is fatpacked or installed into a restricted-resource environment.
.PP
You can also prevent any \s-1XS\s0 dependencies from being installed by setting
\&\f(CW\*(C`PUREPERL_ONLY=1\*(C'\fR in \fIMakefile.PL\fR options (or in the \f(CW\*(C`PERL_MM_OPT\*(C'\fR
environment variable), or using the \f(CW\*(C`\-\-pp\*(C'\fR or \f(CW\*(C`\-\-pureperl\*(C'\fR flags with the
cpanminus client.
.SH "AUTHOR"
.IX Header "AUTHOR"
mst \- Matt S. Trout (cpan:MSTROUT) <mst@shadowcat.co.uk>
.SH "CONTRIBUTORS"
.IX Header "CONTRIBUTORS"
.IP "\(bu" 4
Clinton Gormley <drtech@cpan.org>
.IP "\(bu" 4
Karen Etheridge <ether@cpan.org>
.IP "\(bu" 4
Kieren Diment <diment@gmail.com>
.SH "COPYRIGHT"
.IX Header "COPYRIGHT"
Copyright (c) 2013 the \f(CW\*(C`JSON::MaybeXS\*(C'\fR \*(L"\s-1AUTHOR\*(R"\s0 and \*(L"\s-1CONTRIBUTORS\*(R"\s0
as listed above.
.SH "LICENSE"
.IX Header "LICENSE"
This library is free software and may be distributed under the same terms
as perl itself.