summaryrefslogtreecommitdiffstats
path: root/upstream/debian-unstable/man3/JSON::PP.3perl
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 19:43:11 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 19:43:11 +0000
commitfc22b3d6507c6745911b9dfcc68f1e665ae13dbc (patch)
treece1e3bce06471410239a6f41282e328770aa404a /upstream/debian-unstable/man3/JSON::PP.3perl
parentInitial commit. (diff)
downloadmanpages-l10n-fc22b3d6507c6745911b9dfcc68f1e665ae13dbc.tar.xz
manpages-l10n-fc22b3d6507c6745911b9dfcc68f1e665ae13dbc.zip
Adding upstream version 4.22.0.upstream/4.22.0
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'upstream/debian-unstable/man3/JSON::PP.3perl')
-rw-r--r--upstream/debian-unstable/man3/JSON::PP.3perl1536
1 files changed, 1536 insertions, 0 deletions
diff --git a/upstream/debian-unstable/man3/JSON::PP.3perl b/upstream/debian-unstable/man3/JSON::PP.3perl
new file mode 100644
index 00000000..df007bea
--- /dev/null
+++ b/upstream/debian-unstable/man3/JSON::PP.3perl
@@ -0,0 +1,1536 @@
+.\" -*- mode: troff; coding: utf-8 -*-
+.\" Automatically generated by Pod::Man 5.01 (Pod::Simple 3.43)
+.\"
+.\" 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
+..
+.\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>.
+.ie n \{\
+. ds C` ""
+. ds C' ""
+'br\}
+.el\{\
+. 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::PP 3perl"
+.TH JSON::PP 3perl 2024-01-12 "perl v5.38.2" "Perl Programmers Reference Guide"
+.\" 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::PP \- JSON::XS compatible pure\-Perl module.
+.SH SYNOPSIS
+.IX Header "SYNOPSIS"
+.Vb 1
+\& use JSON::PP;
+\&
+\& # exported functions, they croak on error
+\& # and expect/generate UTF\-8
+\&
+\& $utf8_encoded_json_text = encode_json $perl_hash_or_arrayref;
+\& $perl_hash_or_arrayref = decode_json $utf8_encoded_json_text;
+\&
+\& # OO\-interface
+\&
+\& $json = JSON::PP\->new\->ascii\->pretty\->allow_nonref;
+\&
+\& $pretty_printed_json_text = $json\->encode( $perl_scalar );
+\& $perl_scalar = $json\->decode( $json_text );
+\&
+\& # Note that JSON version 2.0 and above will automatically use
+\& # JSON::XS or JSON::PP, so you should be able to just:
+\&
+\& use JSON;
+.Ve
+.SH DESCRIPTION
+.IX Header "DESCRIPTION"
+JSON::PP is a pure perl JSON decoder/encoder, and (almost) compatible to much
+faster JSON::XS written by Marc Lehmann in C. JSON::PP works as
+a fallback module when you use JSON module without having
+installed JSON::XS.
+.PP
+Because of this fallback feature of JSON.pm, JSON::PP tries not to
+be more JavaScript-friendly than JSON::XS (i.e. not to escape extra
+characters such as U+2028 and U+2029, etc),
+in order for you not to lose such JavaScript-friendliness silently
+when you use JSON.pm and install JSON::XS for speed or by accident.
+If you need JavaScript-friendly RFC7159\-compliant pure perl module,
+try JSON::Tiny, which is derived from Mojolicious web
+framework and is also smaller and faster than JSON::PP.
+.PP
+JSON::PP has been in the Perl core since Perl 5.14, mainly for
+CPAN toolchain modules to parse META.json.
+.SH "FUNCTIONAL INTERFACE"
+.IX Header "FUNCTIONAL INTERFACE"
+This section is taken from JSON::XS almost verbatim. \f(CW\*(C`encode_json\*(C'\fR
+and \f(CW\*(C`decode_json\*(C'\fR are exported by default.
+.SS encode_json
+.IX Subsection "encode_json"
+.Vb 1
+\& $json_text = encode_json $perl_scalar
+.Ve
+.PP
+Converts the given Perl data structure to a UTF\-8 encoded, binary string
+(that is, the string contains octets only). Croaks on error.
+.PP
+This function call is functionally identical to:
+.PP
+.Vb 1
+\& $json_text = JSON::PP\->new\->utf8\->encode($perl_scalar)
+.Ve
+.PP
+Except being faster.
+.SS decode_json
+.IX Subsection "decode_json"
+.Vb 1
+\& $perl_scalar = decode_json $json_text
+.Ve
+.PP
+The opposite of \f(CW\*(C`encode_json\*(C'\fR: expects an UTF\-8 (binary) string and tries
+to parse that as an UTF\-8 encoded JSON text, returning the resulting
+reference. Croaks on error.
+.PP
+This function call is functionally identical to:
+.PP
+.Vb 1
+\& $perl_scalar = JSON::PP\->new\->utf8\->decode($json_text)
+.Ve
+.PP
+Except being faster.
+.SS JSON::PP::is_bool
+.IX Subsection "JSON::PP::is_bool"
+.Vb 1
+\& $is_boolean = JSON::PP::is_bool($scalar)
+.Ve
+.PP
+Returns true if the passed scalar represents either JSON::PP::true or
+JSON::PP::false, two constants that act like \f(CW1\fR and \f(CW0\fR respectively
+and are also used to represent JSON \f(CW\*(C`true\*(C'\fR and \f(CW\*(C`false\*(C'\fR in Perl strings.
+.PP
+On perl 5.36 and above, will also return true when given one of perl's
+standard boolean values, such as the result of a comparison.
+.PP
+See MAPPING, below, for more information on how JSON values are mapped to
+Perl.
+.SH "OBJECT-ORIENTED INTERFACE"
+.IX Header "OBJECT-ORIENTED INTERFACE"
+This section is also taken from JSON::XS.
+.PP
+The object oriented interface lets you configure your own encoding or
+decoding style, within the limits of supported formats.
+.SS new
+.IX Subsection "new"
+.Vb 1
+\& $json = JSON::PP\->new
+.Ve
+.PP
+Creates a new JSON::PP object that can be used to de/encode JSON
+strings. All boolean flags described below are by default \fIdisabled\fR
+(with the exception of \f(CW\*(C`allow_nonref\*(C'\fR, which defaults to \fIenabled\fR since
+version \f(CW4.0\fR).
+.PP
+The mutators for flags all return the JSON::PP object again and thus calls can
+be chained:
+.PP
+.Vb 2
+\& my $json = JSON::PP\->new\->utf8\->space_after\->encode({a => [1,2]})
+\& => {"a": [1, 2]}
+.Ve
+.SS ascii
+.IX Subsection "ascii"
+.Vb 1
+\& $json = $json\->ascii([$enable])
+\&
+\& $enabled = $json\->get_ascii
+.Ve
+.PP
+If \f(CW$enable\fR is true (or missing), then the \f(CW\*(C`encode\*(C'\fR method will not
+generate characters outside the code range \f(CW0..127\fR (which is ASCII). Any
+Unicode characters outside that range will be escaped using either a
+single \euXXXX (BMP characters) or a double \euHHHH\euLLLLL escape sequence,
+as per RFC4627. The resulting encoded JSON text can be treated as a native
+Unicode string, an ascii-encoded, latin1\-encoded or UTF\-8 encoded string,
+or any other superset of ASCII.
+.PP
+If \f(CW$enable\fR is false, then the \f(CW\*(C`encode\*(C'\fR method will not escape Unicode
+characters unless required by the JSON syntax or other flags. This results
+in a faster and more compact format.
+.PP
+See also the section \fIENCODING/CODESET FLAG NOTES\fR later in this document.
+.PP
+The main use for this flag is to produce JSON texts that can be
+transmitted over a 7\-bit channel, as the encoded JSON texts will not
+contain any 8 bit characters.
+.PP
+.Vb 2
+\& JSON::PP\->new\->ascii(1)\->encode([chr 0x10401])
+\& => ["\eud801\eudc01"]
+.Ve
+.SS latin1
+.IX Subsection "latin1"
+.Vb 1
+\& $json = $json\->latin1([$enable])
+\&
+\& $enabled = $json\->get_latin1
+.Ve
+.PP
+If \f(CW$enable\fR is true (or missing), then the \f(CW\*(C`encode\*(C'\fR method will encode
+the resulting JSON text as latin1 (or iso\-8859\-1), escaping any characters
+outside the code range \f(CW0..255\fR. The resulting string can be treated as a
+latin1\-encoded JSON text or a native Unicode string. The \f(CW\*(C`decode\*(C'\fR method
+will not be affected in any way by this flag, as \f(CW\*(C`decode\*(C'\fR by default
+expects Unicode, which is a strict superset of latin1.
+.PP
+If \f(CW$enable\fR is false, then the \f(CW\*(C`encode\*(C'\fR method will not escape Unicode
+characters unless required by the JSON syntax or other flags.
+.PP
+See also the section \fIENCODING/CODESET FLAG NOTES\fR later in this document.
+.PP
+The main use for this flag is efficiently encoding binary data as JSON
+text, as most octets will not be escaped, resulting in a smaller encoded
+size. The disadvantage is that the resulting JSON text is encoded
+in latin1 (and must correctly be treated as such when storing and
+transferring), a rare encoding for JSON. It is therefore most useful when
+you want to store data structures known to contain binary data efficiently
+in files or databases, not when talking to other JSON encoders/decoders.
+.PP
+.Vb 2
+\& JSON::PP\->new\->latin1\->encode (["\ex{89}\ex{abc}"]
+\& => ["\ex{89}\e\eu0abc"] # (perl syntax, U+abc escaped, U+89 not)
+.Ve
+.SS utf8
+.IX Subsection "utf8"
+.Vb 1
+\& $json = $json\->utf8([$enable])
+\&
+\& $enabled = $json\->get_utf8
+.Ve
+.PP
+If \f(CW$enable\fR is true (or missing), then the \f(CW\*(C`encode\*(C'\fR method will encode
+the JSON result into UTF\-8, as required by many protocols, while the
+\&\f(CW\*(C`decode\*(C'\fR method expects to be handled an UTF\-8\-encoded string. Please
+note that UTF\-8\-encoded strings do not contain any characters outside the
+range \f(CW0..255\fR, they are thus useful for bytewise/binary I/O. In future
+versions, enabling this option might enable autodetection of the UTF\-16
+and UTF\-32 encoding families, as described in RFC4627.
+.PP
+If \f(CW$enable\fR is false, then the \f(CW\*(C`encode\*(C'\fR method will return the JSON
+string as a (non-encoded) Unicode string, while \f(CW\*(C`decode\*(C'\fR expects thus a
+Unicode string. Any decoding or encoding (e.g. to UTF\-8 or UTF\-16) needs
+to be done yourself, e.g. using the Encode module.
+.PP
+See also the section \fIENCODING/CODESET FLAG NOTES\fR later in this document.
+.PP
+Example, output UTF\-16BE\-encoded JSON:
+.PP
+.Vb 2
+\& use Encode;
+\& $jsontext = encode "UTF\-16BE", JSON::PP\->new\->encode ($object);
+.Ve
+.PP
+Example, decode UTF\-32LE\-encoded JSON:
+.PP
+.Vb 2
+\& use Encode;
+\& $object = JSON::PP\->new\->decode (decode "UTF\-32LE", $jsontext);
+.Ve
+.SS pretty
+.IX Subsection "pretty"
+.Vb 1
+\& $json = $json\->pretty([$enable])
+.Ve
+.PP
+This enables (or disables) all of the \f(CW\*(C`indent\*(C'\fR, \f(CW\*(C`space_before\*(C'\fR and
+\&\f(CW\*(C`space_after\*(C'\fR (and in the future possibly more) flags in one call to
+generate the most readable (or most compact) form possible.
+.SS indent
+.IX Subsection "indent"
+.Vb 1
+\& $json = $json\->indent([$enable])
+\&
+\& $enabled = $json\->get_indent
+.Ve
+.PP
+If \f(CW$enable\fR is true (or missing), then the \f(CW\*(C`encode\*(C'\fR method will use a multiline
+format as output, putting every array member or object/hash key-value pair
+into its own line, indenting them properly.
+.PP
+If \f(CW$enable\fR is false, no newlines or indenting will be produced, and the
+resulting JSON text is guaranteed not to contain any \f(CW\*(C`newlines\*(C'\fR.
+.PP
+This setting has no effect when decoding JSON texts.
+.PP
+The default indent space length is three.
+You can use \f(CW\*(C`indent_length\*(C'\fR to change the length.
+.SS space_before
+.IX Subsection "space_before"
+.Vb 1
+\& $json = $json\->space_before([$enable])
+\&
+\& $enabled = $json\->get_space_before
+.Ve
+.PP
+If \f(CW$enable\fR is true (or missing), then the \f(CW\*(C`encode\*(C'\fR method will add an extra
+optional space before the \f(CW\*(C`:\*(C'\fR separating keys from values in JSON objects.
+.PP
+If \f(CW$enable\fR is false, then the \f(CW\*(C`encode\*(C'\fR method will not add any extra
+space at those places.
+.PP
+This setting has no effect when decoding JSON texts. You will also
+most likely combine this setting with \f(CW\*(C`space_after\*(C'\fR.
+.PP
+Example, space_before enabled, space_after and indent disabled:
+.PP
+.Vb 1
+\& {"key" :"value"}
+.Ve
+.SS space_after
+.IX Subsection "space_after"
+.Vb 1
+\& $json = $json\->space_after([$enable])
+\&
+\& $enabled = $json\->get_space_after
+.Ve
+.PP
+If \f(CW$enable\fR is true (or missing), then the \f(CW\*(C`encode\*(C'\fR method will add an extra
+optional space after the \f(CW\*(C`:\*(C'\fR separating keys from values in JSON objects
+and extra whitespace after the \f(CW\*(C`,\*(C'\fR separating key-value pairs and array
+members.
+.PP
+If \f(CW$enable\fR is false, then the \f(CW\*(C`encode\*(C'\fR method will not add any extra
+space at those places.
+.PP
+This setting has no effect when decoding JSON texts.
+.PP
+Example, space_before and indent disabled, space_after enabled:
+.PP
+.Vb 1
+\& {"key": "value"}
+.Ve
+.SS relaxed
+.IX Subsection "relaxed"
+.Vb 1
+\& $json = $json\->relaxed([$enable])
+\&
+\& $enabled = $json\->get_relaxed
+.Ve
+.PP
+If \f(CW$enable\fR is true (or missing), then \f(CW\*(C`decode\*(C'\fR will accept some
+extensions to normal JSON syntax (see below). \f(CW\*(C`encode\*(C'\fR will not be
+affected in anyway. \fIBe aware that this option makes you accept invalid
+JSON texts as if they were valid!\fR. I suggest only to use this option to
+parse application-specific files written by humans (configuration files,
+resource files etc.)
+.PP
+If \f(CW$enable\fR is false (the default), then \f(CW\*(C`decode\*(C'\fR will only accept
+valid JSON texts.
+.PP
+Currently accepted extensions are:
+.IP \(bu 4
+list items can have an end-comma
+.Sp
+JSON \fIseparates\fR array elements and key-value pairs with commas. This
+can be annoying if you write JSON texts manually and want to be able to
+quickly append elements, so this extension accepts comma at the end of
+such items not just between them:
+.Sp
+.Vb 8
+\& [
+\& 1,
+\& 2, <\- this comma not normally allowed
+\& ]
+\& {
+\& "k1": "v1",
+\& "k2": "v2", <\- this comma not normally allowed
+\& }
+.Ve
+.IP \(bu 4
+shell-style '#'\-comments
+.Sp
+Whenever JSON allows whitespace, shell-style comments are additionally
+allowed. They are terminated by the first carriage-return or line-feed
+character, after which more white-space and comments are allowed.
+.Sp
+.Vb 4
+\& [
+\& 1, # this comment not allowed in JSON
+\& # neither this one...
+\& ]
+.Ve
+.IP \(bu 4
+C\-style multiple-line '/* */'\-comments (JSON::PP only)
+.Sp
+Whenever JSON allows whitespace, C\-style multiple-line comments are additionally
+allowed. Everything between \f(CW\*(C`/*\*(C'\fR and \f(CW\*(C`*/\*(C'\fR is a comment, after which
+more white-space and comments are allowed.
+.Sp
+.Vb 4
+\& [
+\& 1, /* this comment not allowed in JSON */
+\& /* neither this one... */
+\& ]
+.Ve
+.IP \(bu 4
+C++\-style one-line '//'\-comments (JSON::PP only)
+.Sp
+Whenever JSON allows whitespace, C++\-style one-line comments are additionally
+allowed. They are terminated by the first carriage-return or line-feed
+character, after which more white-space and comments are allowed.
+.Sp
+.Vb 4
+\& [
+\& 1, // this comment not allowed in JSON
+\& // neither this one...
+\& ]
+.Ve
+.IP \(bu 4
+literal ASCII TAB characters in strings
+.Sp
+Literal ASCII TAB characters are now allowed in strings (and treated as
+\&\f(CW\*(C`\et\*(C'\fR).
+.Sp
+.Vb 4
+\& [
+\& "Hello\etWorld",
+\& "Hello<TAB>World", # literal <TAB> would not normally be allowed
+\& ]
+.Ve
+.SS canonical
+.IX Subsection "canonical"
+.Vb 1
+\& $json = $json\->canonical([$enable])
+\&
+\& $enabled = $json\->get_canonical
+.Ve
+.PP
+If \f(CW$enable\fR is true (or missing), then the \f(CW\*(C`encode\*(C'\fR method will output JSON objects
+by sorting their keys. This is adding a comparatively high overhead.
+.PP
+If \f(CW$enable\fR is false, then the \f(CW\*(C`encode\*(C'\fR method will output key-value
+pairs in the order Perl stores them (which will likely change between runs
+of the same script, and can change even within the same run from 5.18
+onwards).
+.PP
+This option is useful if you want the same data structure to be encoded as
+the same JSON text (given the same overall settings). If it is disabled,
+the same hash might be encoded differently even if contains the same data,
+as key-value pairs have no inherent ordering in Perl.
+.PP
+This setting has no effect when decoding JSON texts.
+.PP
+This setting has currently no effect on tied hashes.
+.SS allow_nonref
+.IX Subsection "allow_nonref"
+.Vb 1
+\& $json = $json\->allow_nonref([$enable])
+\&
+\& $enabled = $json\->get_allow_nonref
+.Ve
+.PP
+Unlike other boolean options, this opotion is enabled by default beginning
+with version \f(CW4.0\fR.
+.PP
+If \f(CW$enable\fR is true (or missing), then the \f(CW\*(C`encode\*(C'\fR method can convert a
+non-reference into its corresponding string, number or null JSON value,
+which is an extension to RFC4627. Likewise, \f(CW\*(C`decode\*(C'\fR will accept those JSON
+values instead of croaking.
+.PP
+If \f(CW$enable\fR is false, then the \f(CW\*(C`encode\*(C'\fR method will croak if it isn't
+passed an arrayref or hashref, as JSON texts must either be an object
+or array. Likewise, \f(CW\*(C`decode\*(C'\fR will croak if given something that is not a
+JSON object or array.
+.PP
+Example, encode a Perl scalar as JSON value without enabled \f(CW\*(C`allow_nonref\*(C'\fR,
+resulting in an error:
+.PP
+.Vb 2
+\& JSON::PP\->new\->allow_nonref(0)\->encode ("Hello, World!")
+\& => hash\- or arrayref expected...
+.Ve
+.SS allow_unknown
+.IX Subsection "allow_unknown"
+.Vb 1
+\& $json = $json\->allow_unknown([$enable])
+\&
+\& $enabled = $json\->get_allow_unknown
+.Ve
+.PP
+If \f(CW$enable\fR is true (or missing), then \f(CW\*(C`encode\*(C'\fR will \fInot\fR throw an
+exception when it encounters values it cannot represent in JSON (for
+example, filehandles) but instead will encode a JSON \f(CW\*(C`null\*(C'\fR value. Note
+that blessed objects are not included here and are handled separately by
+c<allow_blessed>.
+.PP
+If \f(CW$enable\fR is false (the default), then \f(CW\*(C`encode\*(C'\fR will throw an
+exception when it encounters anything it cannot encode as JSON.
+.PP
+This option does not affect \f(CW\*(C`decode\*(C'\fR in any way, and it is recommended to
+leave it off unless you know your communications partner.
+.SS allow_blessed
+.IX Subsection "allow_blessed"
+.Vb 1
+\& $json = $json\->allow_blessed([$enable])
+\&
+\& $enabled = $json\->get_allow_blessed
+.Ve
+.PP
+See "OBJECT SERIALISATION" for details.
+.PP
+If \f(CW$enable\fR is true (or missing), then the \f(CW\*(C`encode\*(C'\fR method will not
+barf when it encounters a blessed reference that it cannot convert
+otherwise. Instead, a JSON \f(CW\*(C`null\*(C'\fR value is encoded instead of the object.
+.PP
+If \f(CW$enable\fR is false (the default), then \f(CW\*(C`encode\*(C'\fR will throw an
+exception when it encounters a blessed object that it cannot convert
+otherwise.
+.PP
+This setting has no effect on \f(CW\*(C`decode\*(C'\fR.
+.SS convert_blessed
+.IX Subsection "convert_blessed"
+.Vb 1
+\& $json = $json\->convert_blessed([$enable])
+\&
+\& $enabled = $json\->get_convert_blessed
+.Ve
+.PP
+See "OBJECT SERIALISATION" for details.
+.PP
+If \f(CW$enable\fR is true (or missing), then \f(CW\*(C`encode\*(C'\fR, upon encountering a
+blessed object, will check for the availability of the \f(CW\*(C`TO_JSON\*(C'\fR method
+on the object's class. If found, it will be called in scalar context and
+the resulting scalar will be encoded instead of the object.
+.PP
+The \f(CW\*(C`TO_JSON\*(C'\fR method may safely call die if it wants. If \f(CW\*(C`TO_JSON\*(C'\fR
+returns other blessed objects, those will be handled in the same
+way. \f(CW\*(C`TO_JSON\*(C'\fR must take care of not causing an endless recursion cycle
+(== crash) in this case. The name of \f(CW\*(C`TO_JSON\*(C'\fR was chosen because other
+methods called by the Perl core (== not by the user of the object) are
+usually in upper case letters and to avoid collisions with any \f(CW\*(C`to_json\*(C'\fR
+function or method.
+.PP
+If \f(CW$enable\fR is false (the default), then \f(CW\*(C`encode\*(C'\fR will not consider
+this type of conversion.
+.PP
+This setting has no effect on \f(CW\*(C`decode\*(C'\fR.
+.SS allow_tags
+.IX Subsection "allow_tags"
+.Vb 1
+\& $json = $json\->allow_tags([$enable])
+\&
+\& $enabled = $json\->get_allow_tags
+.Ve
+.PP
+See "OBJECT SERIALISATION" for details.
+.PP
+If \f(CW$enable\fR is true (or missing), then \f(CW\*(C`encode\*(C'\fR, upon encountering a
+blessed object, will check for the availability of the \f(CW\*(C`FREEZE\*(C'\fR method on
+the object's class. If found, it will be used to serialise the object into
+a nonstandard tagged JSON value (that JSON decoders cannot decode).
+.PP
+It also causes \f(CW\*(C`decode\*(C'\fR to parse such tagged JSON values and deserialise
+them via a call to the \f(CW\*(C`THAW\*(C'\fR method.
+.PP
+If \f(CW$enable\fR is false (the default), then \f(CW\*(C`encode\*(C'\fR will not consider
+this type of conversion, and tagged JSON values will cause a parse error
+in \f(CW\*(C`decode\*(C'\fR, as if tags were not part of the grammar.
+.SS boolean_values
+.IX Subsection "boolean_values"
+.Vb 1
+\& $json\->boolean_values([$false, $true])
+\&
+\& ($false, $true) = $json\->get_boolean_values
+.Ve
+.PP
+By default, JSON booleans will be decoded as overloaded
+\&\f(CW$JSON::PP::false\fR and \f(CW$JSON::PP::true\fR objects.
+.PP
+With this method you can specify your own boolean values for decoding \-
+on decode, JSON \f(CW\*(C`false\*(C'\fR will be decoded as a copy of \f(CW$false\fR, and JSON
+\&\f(CW\*(C`true\*(C'\fR will be decoded as \f(CW$true\fR ("copy" here is the same thing as
+assigning a value to another variable, i.e. \f(CW\*(C`$copy = $false\*(C'\fR).
+.PP
+This is useful when you want to pass a decoded data structure directly
+to other serialisers like YAML, Data::MessagePack and so on.
+.PP
+Note that this works only when you \f(CW\*(C`decode\*(C'\fR. You can set incompatible
+boolean objects (like boolean), but when you \f(CW\*(C`encode\*(C'\fR a data structure
+with such boolean objects, you still need to enable \f(CW\*(C`convert_blessed\*(C'\fR
+(and add a \f(CW\*(C`TO_JSON\*(C'\fR method if necessary).
+.PP
+Calling this method without any arguments will reset the booleans
+to their default values.
+.PP
+\&\f(CW\*(C`get_boolean_values\*(C'\fR will return both \f(CW$false\fR and \f(CW$true\fR values, or
+the empty list when they are set to the default.
+.SS core_bools
+.IX Subsection "core_bools"
+.Vb 1
+\& $json\->core_bools([$enable]);
+.Ve
+.PP
+If \f(CW$enable\fR is true (or missing), then \f(CW\*(C`decode\*(C'\fR, will produce standard
+perl boolean values. Equivalent to calling:
+.PP
+.Vb 1
+\& $json\->boolean_values(!!1, !!0)
+.Ve
+.PP
+\&\f(CW\*(C`get_core_bools\*(C'\fR will return true if this has been set. On perl 5.36, it will
+also return true if the boolean values have been set to perl's core booleans
+using the \f(CW\*(C`boolean_values\*(C'\fR method.
+.PP
+The methods \f(CW\*(C`unblessed_bool\*(C'\fR and \f(CW\*(C`get_unblessed_bool\*(C'\fR are provided as aliases
+for compatibility with Cpanel::JSON::XS.
+.SS filter_json_object
+.IX Subsection "filter_json_object"
+.Vb 1
+\& $json = $json\->filter_json_object([$coderef])
+.Ve
+.PP
+When \f(CW$coderef\fR is specified, it will be called from \f(CW\*(C`decode\*(C'\fR each
+time it decodes a JSON object. The only argument is a reference to
+the newly-created hash. If the code references returns a single scalar
+(which need not be a reference), this value (or rather a copy of it) is
+inserted into the deserialised data structure. If it returns an empty
+list (NOTE: \fInot\fR \f(CW\*(C`undef\*(C'\fR, which is a valid scalar), the original
+deserialised hash will be inserted. This setting can slow down decoding
+considerably.
+.PP
+When \f(CW$coderef\fR is omitted or undefined, any existing callback will
+be removed and \f(CW\*(C`decode\*(C'\fR will not change the deserialised hash in any
+way.
+.PP
+Example, convert all JSON objects into the integer 5:
+.PP
+.Vb 5
+\& my $js = JSON::PP\->new\->filter_json_object(sub { 5 });
+\& # returns [5]
+\& $js\->decode(\*(Aq[{}]\*(Aq);
+\& # returns 5
+\& $js\->decode(\*(Aq{"a":1, "b":2}\*(Aq);
+.Ve
+.SS filter_json_single_key_object
+.IX Subsection "filter_json_single_key_object"
+.Vb 1
+\& $json = $json\->filter_json_single_key_object($key [=> $coderef])
+.Ve
+.PP
+Works remotely similar to \f(CW\*(C`filter_json_object\*(C'\fR, but is only called for
+JSON objects having a single key named \f(CW$key\fR.
+.PP
+This \f(CW$coderef\fR is called before the one specified via
+\&\f(CW\*(C`filter_json_object\*(C'\fR, if any. It gets passed the single value in the JSON
+object. If it returns a single value, it will be inserted into the data
+structure. If it returns nothing (not even \f(CW\*(C`undef\*(C'\fR but the empty list),
+the callback from \f(CW\*(C`filter_json_object\*(C'\fR will be called next, as if no
+single-key callback were specified.
+.PP
+If \f(CW$coderef\fR is omitted or undefined, the corresponding callback will be
+disabled. There can only ever be one callback for a given key.
+.PP
+As this callback gets called less often then the \f(CW\*(C`filter_json_object\*(C'\fR
+one, decoding speed will not usually suffer as much. Therefore, single-key
+objects make excellent targets to serialise Perl objects into, especially
+as single-key JSON objects are as close to the type-tagged value concept
+as JSON gets (it's basically an ID/VALUE tuple). Of course, JSON does not
+support this in any way, so you need to make sure your data never looks
+like a serialised Perl hash.
+.PP
+Typical names for the single object key are \f(CW\*(C`_\|_class_whatever_\|_\*(C'\fR, or
+\&\f(CW\*(C`$_\|_dollars_are_rarely_used_\|_$\*(C'\fR or \f(CW\*(C`}ugly_brace_placement\*(C'\fR, or even
+things like \f(CW\*(C`_\|_class_md5sum(classname)_\|_\*(C'\fR, to reduce the risk of clashing
+with real hashes.
+.PP
+Example, decode JSON objects of the form \f(CW\*(C`{ "_\|_widget_\|_" => <id> }\*(C'\fR
+into the corresponding \f(CW$WIDGET{<id>}\fR object:
+.PP
+.Vb 7
+\& # return whatever is in $WIDGET{5}:
+\& JSON::PP
+\& \->new
+\& \->filter_json_single_key_object (_\|_widget_\|_ => sub {
+\& $WIDGET{ $_[0] }
+\& })
+\& \->decode (\*(Aq{"_\|_widget_\|_": 5\*(Aq)
+\&
+\& # this can be used with a TO_JSON method in some "widget" class
+\& # for serialisation to json:
+\& sub WidgetBase::TO_JSON {
+\& my ($self) = @_;
+\&
+\& unless ($self\->{id}) {
+\& $self\->{id} = ..get..some..id..;
+\& $WIDGET{$self\->{id}} = $self;
+\& }
+\&
+\& { _\|_widget_\|_ => $self\->{id} }
+\& }
+.Ve
+.SS shrink
+.IX Subsection "shrink"
+.Vb 1
+\& $json = $json\->shrink([$enable])
+\&
+\& $enabled = $json\->get_shrink
+.Ve
+.PP
+If \f(CW$enable\fR is true (or missing), the string returned by \f(CW\*(C`encode\*(C'\fR will
+be shrunk (i.e. downgraded if possible).
+.PP
+The actual definition of what shrink does might change in future versions,
+but it will always try to save space at the expense of time.
+.PP
+If \f(CW$enable\fR is false, then JSON::PP does nothing.
+.SS max_depth
+.IX Subsection "max_depth"
+.Vb 1
+\& $json = $json\->max_depth([$maximum_nesting_depth])
+\&
+\& $max_depth = $json\->get_max_depth
+.Ve
+.PP
+Sets the maximum nesting level (default \f(CW512\fR) accepted while encoding
+or decoding. If a higher nesting level is detected in JSON text or a Perl
+data structure, then the encoder and decoder will stop and croak at that
+point.
+.PP
+Nesting level is defined by number of hash\- or arrayrefs that the encoder
+needs to traverse to reach a given point or the number of \f(CW\*(C`{\*(C'\fR or \f(CW\*(C`[\*(C'\fR
+characters without their matching closing parenthesis crossed to reach a
+given character in a string.
+.PP
+Setting the maximum depth to one disallows any nesting, so that ensures
+that the object is only a single hash/object or array.
+.PP
+If no argument is given, the highest possible setting will be used, which
+is rarely useful.
+.PP
+See "SECURITY CONSIDERATIONS" in JSON::XS for more info on why this is useful.
+.SS max_size
+.IX Subsection "max_size"
+.Vb 1
+\& $json = $json\->max_size([$maximum_string_size])
+\&
+\& $max_size = $json\->get_max_size
+.Ve
+.PP
+Set the maximum length a JSON text may have (in bytes) where decoding is
+being attempted. The default is \f(CW0\fR, meaning no limit. When \f(CW\*(C`decode\*(C'\fR
+is called on a string that is longer then this many bytes, it will not
+attempt to decode the string but throw an exception. This setting has no
+effect on \f(CW\*(C`encode\*(C'\fR (yet).
+.PP
+If no argument is given, the limit check will be deactivated (same as when
+\&\f(CW0\fR is specified).
+.PP
+See "SECURITY CONSIDERATIONS" in JSON::XS for more info on why this is useful.
+.SS encode
+.IX Subsection "encode"
+.Vb 1
+\& $json_text = $json\->encode($perl_scalar)
+.Ve
+.PP
+Converts the given Perl value or data structure to its JSON
+representation. Croaks on error.
+.SS decode
+.IX Subsection "decode"
+.Vb 1
+\& $perl_scalar = $json\->decode($json_text)
+.Ve
+.PP
+The opposite of \f(CW\*(C`encode\*(C'\fR: expects a JSON text and tries to parse it,
+returning the resulting simple scalar or reference. Croaks on error.
+.SS decode_prefix
+.IX Subsection "decode_prefix"
+.Vb 1
+\& ($perl_scalar, $characters) = $json\->decode_prefix($json_text)
+.Ve
+.PP
+This works like the \f(CW\*(C`decode\*(C'\fR method, but instead of raising an exception
+when there is trailing garbage after the first JSON object, it will
+silently stop parsing there and return the number of characters consumed
+so far.
+.PP
+This is useful if your JSON texts are not delimited by an outer protocol
+and you need to know where the JSON text ends.
+.PP
+.Vb 2
+\& JSON::PP\->new\->decode_prefix ("[1] the tail")
+\& => ([1], 3)
+.Ve
+.SH "FLAGS FOR JSON::PP ONLY"
+.IX Header "FLAGS FOR JSON::PP ONLY"
+The following flags and properties are for JSON::PP only. If you use
+any of these, you can't make your application run faster by replacing
+JSON::PP with JSON::XS. If you need these and also speed boost,
+you might want to try Cpanel::JSON::XS, a fork of JSON::XS by
+Reini Urban, which supports some of these (with a different set of
+incompatibilities). Most of these historical flags are only kept
+for backward compatibility, and should not be used in a new application.
+.SS allow_singlequote
+.IX Subsection "allow_singlequote"
+.Vb 2
+\& $json = $json\->allow_singlequote([$enable])
+\& $enabled = $json\->get_allow_singlequote
+.Ve
+.PP
+If \f(CW$enable\fR is true (or missing), then \f(CW\*(C`decode\*(C'\fR will accept
+invalid JSON texts that contain strings that begin and end with
+single quotation marks. \f(CW\*(C`encode\*(C'\fR will not be affected in any way.
+\&\fIBe aware that this option makes you accept invalid JSON texts
+as if they were valid!\fR. I suggest only to use this option to
+parse application-specific files written by humans (configuration
+files, resource files etc.)
+.PP
+If \f(CW$enable\fR is false (the default), then \f(CW\*(C`decode\*(C'\fR will only accept
+valid JSON texts.
+.PP
+.Vb 3
+\& $json\->allow_singlequote\->decode(qq|{"foo":\*(Aqbar\*(Aq}|);
+\& $json\->allow_singlequote\->decode(qq|{\*(Aqfoo\*(Aq:"bar"}|);
+\& $json\->allow_singlequote\->decode(qq|{\*(Aqfoo\*(Aq:\*(Aqbar\*(Aq}|);
+.Ve
+.SS allow_barekey
+.IX Subsection "allow_barekey"
+.Vb 2
+\& $json = $json\->allow_barekey([$enable])
+\& $enabled = $json\->get_allow_barekey
+.Ve
+.PP
+If \f(CW$enable\fR is true (or missing), then \f(CW\*(C`decode\*(C'\fR will accept
+invalid JSON texts that contain JSON objects whose names don't
+begin and end with quotation marks. \f(CW\*(C`encode\*(C'\fR will not be affected
+in any way. \fIBe aware that this option makes you accept invalid JSON
+texts as if they were valid!\fR. I suggest only to use this option to
+parse application-specific files written by humans (configuration
+files, resource files etc.)
+.PP
+If \f(CW$enable\fR is false (the default), then \f(CW\*(C`decode\*(C'\fR will only accept
+valid JSON texts.
+.PP
+.Vb 1
+\& $json\->allow_barekey\->decode(qq|{foo:"bar"}|);
+.Ve
+.SS allow_bignum
+.IX Subsection "allow_bignum"
+.Vb 2
+\& $json = $json\->allow_bignum([$enable])
+\& $enabled = $json\->get_allow_bignum
+.Ve
+.PP
+If \f(CW$enable\fR is true (or missing), then \f(CW\*(C`decode\*(C'\fR will convert
+big integers Perl cannot handle as integer into Math::BigInt
+objects and convert floating numbers into Math::BigFloat
+objects. \f(CW\*(C`encode\*(C'\fR will convert \f(CW\*(C`Math::BigInt\*(C'\fR and \f(CW\*(C`Math::BigFloat\*(C'\fR
+objects into JSON numbers.
+.PP
+.Vb 4
+\& $json\->allow_nonref\->allow_bignum;
+\& $bigfloat = $json\->decode(\*(Aq2.000000000000000000000000001\*(Aq);
+\& print $json\->encode($bigfloat);
+\& # => 2.000000000000000000000000001
+.Ve
+.PP
+See also MAPPING.
+.SS loose
+.IX Subsection "loose"
+.Vb 2
+\& $json = $json\->loose([$enable])
+\& $enabled = $json\->get_loose
+.Ve
+.PP
+If \f(CW$enable\fR is true (or missing), then \f(CW\*(C`decode\*(C'\fR will accept
+invalid JSON texts that contain unescaped [\ex00\-\ex1f\ex22\ex5c]
+characters. \f(CW\*(C`encode\*(C'\fR will not be affected in any way.
+\&\fIBe aware that this option makes you accept invalid JSON texts
+as if they were valid!\fR. I suggest only to use this option to
+parse application-specific files written by humans (configuration
+files, resource files etc.)
+.PP
+If \f(CW$enable\fR is false (the default), then \f(CW\*(C`decode\*(C'\fR will only accept
+valid JSON texts.
+.PP
+.Vb 2
+\& $json\->loose\->decode(qq|["abc
+\& def"]|);
+.Ve
+.SS escape_slash
+.IX Subsection "escape_slash"
+.Vb 2
+\& $json = $json\->escape_slash([$enable])
+\& $enabled = $json\->get_escape_slash
+.Ve
+.PP
+If \f(CW$enable\fR is true (or missing), then \f(CW\*(C`encode\*(C'\fR will explicitly
+escape \fIslash\fR (solidus; \f(CW\*(C`U+002F\*(C'\fR) characters to reduce the risk of
+XSS (cross site scripting) that may be caused by \f(CW\*(C`</script>\*(C'\fR
+in a JSON text, with the cost of bloating the size of JSON texts.
+.PP
+This option may be useful when you embed JSON in HTML, but embedding
+arbitrary JSON in HTML (by some HTML template toolkit or by string
+interpolation) is risky in general. You must escape necessary
+characters in correct order, depending on the context.
+.PP
+\&\f(CW\*(C`decode\*(C'\fR will not be affected in any way.
+.SS indent_length
+.IX Subsection "indent_length"
+.Vb 2
+\& $json = $json\->indent_length($number_of_spaces)
+\& $length = $json\->get_indent_length
+.Ve
+.PP
+This option is only useful when you also enable \f(CW\*(C`indent\*(C'\fR or \f(CW\*(C`pretty\*(C'\fR.
+.PP
+JSON::XS indents with three spaces when you \f(CW\*(C`encode\*(C'\fR (if requested
+by \f(CW\*(C`indent\*(C'\fR or \f(CW\*(C`pretty\*(C'\fR), and the number cannot be changed.
+JSON::PP allows you to change/get the number of indent spaces with these
+mutator/accessor. The default number of spaces is three (the same as
+JSON::XS), and the acceptable range is from \f(CW0\fR (no indentation;
+it'd be better to disable indentation by \f(CWindent(0)\fR) to \f(CW15\fR.
+.SS sort_by
+.IX Subsection "sort_by"
+.Vb 2
+\& $json = $json\->sort_by($code_ref)
+\& $json = $json\->sort_by($subroutine_name)
+.Ve
+.PP
+If you just want to sort keys (names) in JSON objects when you
+\&\f(CW\*(C`encode\*(C'\fR, enable \f(CW\*(C`canonical\*(C'\fR option (see above) that allows you to
+sort object keys alphabetically.
+.PP
+If you do need to sort non-alphabetically for whatever reasons,
+you can give a code reference (or a subroutine name) to \f(CW\*(C`sort_by\*(C'\fR,
+then the argument will be passed to Perl's \f(CW\*(C`sort\*(C'\fR built-in function.
+.PP
+As the sorting is done in the JSON::PP scope, you usually need to
+prepend \f(CW\*(C`JSON::PP::\*(C'\fR to the subroutine name, and the special variables
+\&\f(CW$a\fR and \f(CW$b\fR used in the subrontine used by \f(CW\*(C`sort\*(C'\fR function.
+.PP
+Example:
+.PP
+.Vb 9
+\& my %ORDER = (id => 1, class => 2, name => 3);
+\& $json\->sort_by(sub {
+\& ($ORDER{$JSON::PP::a} // 999) <=> ($ORDER{$JSON::PP::b} // 999)
+\& or $JSON::PP::a cmp $JSON::PP::b
+\& });
+\& print $json\->encode([
+\& {name => \*(AqCPAN\*(Aq, id => 1, href => \*(Aqhttp://cpan.org\*(Aq}
+\& ]);
+\& # [{"id":1,"name":"CPAN","href":"http://cpan.org"}]
+.Ve
+.PP
+Note that \f(CW\*(C`sort_by\*(C'\fR affects all the plain hashes in the data structure.
+If you need finer control, \f(CW\*(C`tie\*(C'\fR necessary hashes with a module that
+implements ordered hash (such as Hash::Ordered and Tie::IxHash).
+\&\f(CW\*(C`canonical\*(C'\fR and \f(CW\*(C`sort_by\*(C'\fR don't affect the key order in \f(CW\*(C`tie\*(C'\fRd
+hashes.
+.PP
+.Vb 5
+\& use Hash::Ordered;
+\& tie my %hash, \*(AqHash::Ordered\*(Aq,
+\& (name => \*(AqCPAN\*(Aq, id => 1, href => \*(Aqhttp://cpan.org\*(Aq);
+\& print $json\->encode([\e%hash]);
+\& # [{"name":"CPAN","id":1,"href":"http://cpan.org"}] # order is kept
+.Ve
+.SH "INCREMENTAL PARSING"
+.IX Header "INCREMENTAL PARSING"
+This section is also taken from JSON::XS.
+.PP
+In some cases, there is the need for incremental parsing of JSON
+texts. While this module always has to keep both JSON text and resulting
+Perl data structure in memory at one time, it does allow you to parse a
+JSON stream incrementally. It does so by accumulating text until it has
+a full JSON object, which it then can decode. This process is similar to
+using \f(CW\*(C`decode_prefix\*(C'\fR to see if a full JSON object is available, but
+is much more efficient (and can be implemented with a minimum of method
+calls).
+.PP
+JSON::PP will only attempt to parse the JSON text once it is sure it
+has enough text to get a decisive result, using a very simple but
+truly incremental parser. This means that it sometimes won't stop as
+early as the full parser, for example, it doesn't detect mismatched
+parentheses. The only thing it guarantees is that it starts decoding as
+soon as a syntactically valid JSON text has been seen. This means you need
+to set resource limits (e.g. \f(CW\*(C`max_size\*(C'\fR) to ensure the parser will stop
+parsing in the presence if syntax errors.
+.PP
+The following methods implement this incremental parser.
+.SS incr_parse
+.IX Subsection "incr_parse"
+.Vb 1
+\& $json\->incr_parse( [$string] ) # void context
+\&
+\& $obj_or_undef = $json\->incr_parse( [$string] ) # scalar context
+\&
+\& @obj_or_empty = $json\->incr_parse( [$string] ) # list context
+.Ve
+.PP
+This is the central parsing function. It can both append new text and
+extract objects from the stream accumulated so far (both of these
+functions are optional).
+.PP
+If \f(CW$string\fR is given, then this string is appended to the already
+existing JSON fragment stored in the \f(CW$json\fR object.
+.PP
+After that, if the function is called in void context, it will simply
+return without doing anything further. This can be used to add more text
+in as many chunks as you want.
+.PP
+If the method is called in scalar context, then it will try to extract
+exactly \fIone\fR JSON object. If that is successful, it will return this
+object, otherwise it will return \f(CW\*(C`undef\*(C'\fR. If there is a parse error,
+this method will croak just as \f(CW\*(C`decode\*(C'\fR would do (one can then use
+\&\f(CW\*(C`incr_skip\*(C'\fR to skip the erroneous part). This is the most common way of
+using the method.
+.PP
+And finally, in list context, it will try to extract as many objects
+from the stream as it can find and return them, or the empty list
+otherwise. For this to work, there must be no separators (other than
+whitespace) between the JSON objects or arrays, instead they must be
+concatenated back-to-back. If an error occurs, an exception will be
+raised as in the scalar context case. Note that in this case, any
+previously-parsed JSON texts will be lost.
+.PP
+Example: Parse some JSON arrays/objects in a given string and return
+them.
+.PP
+.Vb 1
+\& my @objs = JSON::PP\->new\->incr_parse ("[5][7][1,2]");
+.Ve
+.SS incr_text
+.IX Subsection "incr_text"
+.Vb 1
+\& $lvalue_string = $json\->incr_text
+.Ve
+.PP
+This method returns the currently stored JSON fragment as an lvalue, that
+is, you can manipulate it. This \fIonly\fR works when a preceding call to
+\&\f(CW\*(C`incr_parse\*(C'\fR in \fIscalar context\fR successfully returned an object. Under
+all other circumstances you must not call this function (I mean it.
+although in simple tests it might actually work, it \fIwill\fR fail under
+real world conditions). As a special exception, you can also call this
+method before having parsed anything.
+.PP
+That means you can only use this function to look at or manipulate text
+before or after complete JSON objects, not while the parser is in the
+middle of parsing a JSON object.
+.PP
+This function is useful in two cases: a) finding the trailing text after a
+JSON object or b) parsing multiple JSON objects separated by non-JSON text
+(such as commas).
+.SS incr_skip
+.IX Subsection "incr_skip"
+.Vb 1
+\& $json\->incr_skip
+.Ve
+.PP
+This will reset the state of the incremental parser and will remove
+the parsed text from the input buffer so far. This is useful after
+\&\f(CW\*(C`incr_parse\*(C'\fR died, in which case the input buffer and incremental parser
+state is left unchanged, to skip the text parsed so far and to reset the
+parse state.
+.PP
+The difference to \f(CW\*(C`incr_reset\*(C'\fR is that only text until the parse error
+occurred is removed.
+.SS incr_reset
+.IX Subsection "incr_reset"
+.Vb 1
+\& $json\->incr_reset
+.Ve
+.PP
+This completely resets the incremental parser, that is, after this call,
+it will be as if the parser had never parsed anything.
+.PP
+This is useful if you want to repeatedly parse JSON objects and want to
+ignore any trailing data, which means you have to reset the parser after
+each successful decode.
+.SH MAPPING
+.IX Header "MAPPING"
+Most of this section is also taken from JSON::XS.
+.PP
+This section describes how JSON::PP maps Perl values to JSON values and
+vice versa. These mappings are designed to "do the right thing" in most
+circumstances automatically, preserving round-tripping characteristics
+(what you put in comes out as something equivalent).
+.PP
+For the more enlightened: note that in the following descriptions,
+lowercase \fIperl\fR refers to the Perl interpreter, while uppercase \fIPerl\fR
+refers to the abstract Perl language itself.
+.SS "JSON \-> PERL"
+.IX Subsection "JSON -> PERL"
+.IP object 4
+.IX Item "object"
+A JSON object becomes a reference to a hash in Perl. No ordering of object
+keys is preserved (JSON does not preserve object key ordering itself).
+.IP array 4
+.IX Item "array"
+A JSON array becomes a reference to an array in Perl.
+.IP string 4
+.IX Item "string"
+A JSON string becomes a string scalar in Perl \- Unicode codepoints in JSON
+are represented by the same codepoints in the Perl string, so no manual
+decoding is necessary.
+.IP number 4
+.IX Item "number"
+A JSON number becomes either an integer, numeric (floating point) or
+string scalar in perl, depending on its range and any fractional parts. On
+the Perl level, there is no difference between those as Perl handles all
+the conversion details, but an integer may take slightly less memory and
+might represent more values exactly than floating point numbers.
+.Sp
+If the number consists of digits only, JSON::PP will try to represent
+it as an integer value. If that fails, it will try to represent it as
+a numeric (floating point) value if that is possible without loss of
+precision. Otherwise it will preserve the number as a string value (in
+which case you lose roundtripping ability, as the JSON number will be
+re-encoded to a JSON string).
+.Sp
+Numbers containing a fractional or exponential part will always be
+represented as numeric (floating point) values, possibly at a loss of
+precision (in which case you might lose perfect roundtripping ability, but
+the JSON number will still be re-encoded as a JSON number).
+.Sp
+Note that precision is not accuracy \- binary floating point values cannot
+represent most decimal fractions exactly, and when converting from and to
+floating point, JSON::PP only guarantees precision up to but not including
+the least significant bit.
+.Sp
+When \f(CW\*(C`allow_bignum\*(C'\fR is enabled, big integer values and any numeric
+values will be converted into Math::BigInt and Math::BigFloat
+objects respectively, without becoming string scalars or losing
+precision.
+.IP "true, false" 4
+.IX Item "true, false"
+These JSON atoms become \f(CW\*(C`JSON::PP::true\*(C'\fR and \f(CW\*(C`JSON::PP::false\*(C'\fR,
+respectively. They are overloaded to act almost exactly like the numbers
+\&\f(CW1\fR and \f(CW0\fR. You can check whether a scalar is a JSON boolean by using
+the \f(CW\*(C`JSON::PP::is_bool\*(C'\fR function.
+.IP null 4
+.IX Item "null"
+A JSON null atom becomes \f(CW\*(C`undef\*(C'\fR in Perl.
+.ie n .IP "shell-style comments (""# \fItext\fR"")" 4
+.el .IP "shell-style comments (\f(CW# \fR\f(CItext\fR\f(CW\fR)" 4
+.IX Item "shell-style comments (# text)"
+As a nonstandard extension to the JSON syntax that is enabled by the
+\&\f(CW\*(C`relaxed\*(C'\fR setting, shell-style comments are allowed. They can start
+anywhere outside strings and go till the end of the line.
+.ie n .IP "tagged values (""(\fItag\fR)\fIvalue\fR"")." 4
+.el .IP "tagged values (\f(CW(\fR\f(CItag\fR\f(CW)\fR\f(CIvalue\fR\f(CW\fR)." 4
+.IX Item "tagged values ((tag)value)."
+Another nonstandard extension to the JSON syntax, enabled with the
+\&\f(CW\*(C`allow_tags\*(C'\fR setting, are tagged values. In this implementation, the
+\&\fItag\fR must be a perl package/class name encoded as a JSON string, and the
+\&\fIvalue\fR must be a JSON array encoding optional constructor arguments.
+.Sp
+See "OBJECT SERIALISATION", below, for details.
+.SS "PERL \-> JSON"
+.IX Subsection "PERL -> JSON"
+The mapping from Perl to JSON is slightly more difficult, as Perl is a
+truly typeless language, so we can only guess which JSON type is meant by
+a Perl value.
+.IP "hash references" 4
+.IX Item "hash references"
+Perl hash references become JSON objects. As there is no inherent
+ordering in hash keys (or JSON objects), they will usually be encoded
+in a pseudo-random order. JSON::PP can optionally sort the hash keys
+(determined by the \fIcanonical\fR flag and/or \fIsort_by\fR property), so
+the same data structure will serialise to the same JSON text (given
+same settings and version of JSON::PP), but this incurs a runtime
+overhead and is only rarely useful, e.g. when you want to compare some
+JSON text against another for equality.
+.IP "array references" 4
+.IX Item "array references"
+Perl array references become JSON arrays.
+.IP "other references" 4
+.IX Item "other references"
+Other unblessed references are generally not allowed and will cause an
+exception to be thrown, except for references to the integers \f(CW0\fR and
+\&\f(CW1\fR, which get turned into \f(CW\*(C`false\*(C'\fR and \f(CW\*(C`true\*(C'\fR atoms in JSON. You can
+also use \f(CW\*(C`JSON::PP::false\*(C'\fR and \f(CW\*(C`JSON::PP::true\*(C'\fR to improve
+readability.
+.Sp
+.Vb 1
+\& to_json [\e0, JSON::PP::true] # yields [false,true]
+.Ve
+.IP "JSON::PP::true, JSON::PP::false" 4
+.IX Item "JSON::PP::true, JSON::PP::false"
+These special values become JSON true and JSON false values,
+respectively. You can also use \f(CW\*(C`\e1\*(C'\fR and \f(CW\*(C`\e0\*(C'\fR directly if you want.
+.IP JSON::PP::null 4
+.IX Item "JSON::PP::null"
+This special value becomes JSON null.
+.IP "blessed objects" 4
+.IX Item "blessed objects"
+Blessed objects are not directly representable in JSON, but \f(CW\*(C`JSON::PP\*(C'\fR
+allows various ways of handling objects. See "OBJECT SERIALISATION",
+below, for details.
+.IP "simple scalars" 4
+.IX Item "simple scalars"
+Simple Perl scalars (any scalar that is not a reference) are the most
+difficult objects to encode: JSON::PP will encode undefined scalars as
+JSON \f(CW\*(C`null\*(C'\fR values, scalars that have last been used in a string context
+before encoding as JSON strings, and anything else as number value:
+.Sp
+.Vb 4
+\& # dump as number
+\& encode_json [2] # yields [2]
+\& encode_json [\-3.0e17] # yields [\-3e+17]
+\& my $value = 5; encode_json [$value] # yields [5]
+\&
+\& # used as string, so dump as string
+\& print $value;
+\& encode_json [$value] # yields ["5"]
+\&
+\& # undef becomes null
+\& encode_json [undef] # yields [null]
+.Ve
+.Sp
+You can force the type to be a JSON string by stringifying it:
+.Sp
+.Vb 5
+\& my $x = 3.1; # some variable containing a number
+\& "$x"; # stringified
+\& $x .= ""; # another, more awkward way to stringify
+\& print $x; # perl does it for you, too, quite often
+\& # (but for older perls)
+.Ve
+.Sp
+You can force the type to be a JSON number by numifying it:
+.Sp
+.Vb 3
+\& my $x = "3"; # some variable containing a string
+\& $x += 0; # numify it, ensuring it will be dumped as a number
+\& $x *= 1; # same thing, the choice is yours.
+.Ve
+.Sp
+You can not currently force the type in other, less obscure, ways.
+.Sp
+Since version 2.91_01, JSON::PP uses a different number detection logic
+that converts a scalar that is possible to turn into a number safely.
+The new logic is slightly faster, and tends to help people who use older
+perl or who want to encode complicated data structure. However, this may
+results in a different JSON text from the one JSON::XS encodes (and
+thus may break tests that compare entire JSON texts). If you do
+need the previous behavior for compatibility or for finer control,
+set PERL_JSON_PP_USE_B environmental variable to true before you
+\&\f(CW\*(C`use\*(C'\fR JSON::PP (or JSON.pm).
+.Sp
+Note that numerical precision has the same meaning as under Perl (so
+binary to decimal conversion follows the same rules as in Perl, which
+can differ to other languages). Also, your perl interpreter might expose
+extensions to the floating point numbers of your platform, such as
+infinities or NaN's \- these cannot be represented in JSON, and it is an
+error to pass those in.
+.Sp
+JSON::PP (and JSON::XS) trusts what you pass to \f(CW\*(C`encode\*(C'\fR method
+(or \f(CW\*(C`encode_json\*(C'\fR function) is a clean, validated data structure with
+values that can be represented as valid JSON values only, because it's
+not from an external data source (as opposed to JSON texts you pass to
+\&\f(CW\*(C`decode\*(C'\fR or \f(CW\*(C`decode_json\*(C'\fR, which JSON::PP considers tainted and
+doesn't trust). As JSON::PP doesn't know exactly what you and consumers
+of your JSON texts want the unexpected values to be (you may want to
+convert them into null, or to stringify them with or without
+normalisation (string representation of infinities/NaN may vary
+depending on platforms), or to croak without conversion), you're advised
+to do what you and your consumers need before you encode, and also not
+to numify values that may start with values that look like a number
+(including infinities/NaN), without validating.
+.SS "OBJECT SERIALISATION"
+.IX Subsection "OBJECT SERIALISATION"
+As JSON cannot directly represent Perl objects, you have to choose between
+a pure JSON representation (without the ability to deserialise the object
+automatically again), and a nonstandard extension to the JSON syntax,
+tagged values.
+.PP
+\fISERIALISATION\fR
+.IX Subsection "SERIALISATION"
+.PP
+What happens when \f(CW\*(C`JSON::PP\*(C'\fR encounters a Perl object depends on the
+\&\f(CW\*(C`allow_blessed\*(C'\fR, \f(CW\*(C`convert_blessed\*(C'\fR, \f(CW\*(C`allow_tags\*(C'\fR and \f(CW\*(C`allow_bignum\*(C'\fR
+settings, which are used in this order:
+.ie n .IP "1. ""allow_tags"" is enabled and the object has a ""FREEZE"" method." 4
+.el .IP "1. \f(CWallow_tags\fR is enabled and the object has a \f(CWFREEZE\fR method." 4
+.IX Item "1. allow_tags is enabled and the object has a FREEZE method."
+In this case, \f(CW\*(C`JSON::PP\*(C'\fR creates a tagged JSON value, using a nonstandard
+extension to the JSON syntax.
+.Sp
+This works by invoking the \f(CW\*(C`FREEZE\*(C'\fR method on the object, with the first
+argument being the object to serialise, and the second argument being the
+constant string \f(CW\*(C`JSON\*(C'\fR to distinguish it from other serialisers.
+.Sp
+The \f(CW\*(C`FREEZE\*(C'\fR method can return any number of values (i.e. zero or
+more). These values and the paclkage/classname of the object will then be
+encoded as a tagged JSON value in the following format:
+.Sp
+.Vb 1
+\& ("classname")[FREEZE return values...]
+.Ve
+.Sp
+e.g.:
+.Sp
+.Vb 3
+\& ("URI")["http://www.google.com/"]
+\& ("MyDate")[2013,10,29]
+\& ("ImageData::JPEG")["Z3...VlCg=="]
+.Ve
+.Sp
+For example, the hypothetical \f(CW\*(C`My::Object\*(C'\fR \f(CW\*(C`FREEZE\*(C'\fR method might use the
+objects \f(CW\*(C`type\*(C'\fR and \f(CW\*(C`id\*(C'\fR members to encode the object:
+.Sp
+.Vb 2
+\& sub My::Object::FREEZE {
+\& my ($self, $serialiser) = @_;
+\&
+\& ($self\->{type}, $self\->{id})
+\& }
+.Ve
+.ie n .IP "2. ""convert_blessed"" is enabled and the object has a ""TO_JSON"" method." 4
+.el .IP "2. \f(CWconvert_blessed\fR is enabled and the object has a \f(CWTO_JSON\fR method." 4
+.IX Item "2. convert_blessed is enabled and the object has a TO_JSON method."
+In this case, the \f(CW\*(C`TO_JSON\*(C'\fR method of the object is invoked in scalar
+context. It must return a single scalar that can be directly encoded into
+JSON. This scalar replaces the object in the JSON text.
+.Sp
+For example, the following \f(CW\*(C`TO_JSON\*(C'\fR method will convert all URI
+objects to JSON strings when serialised. The fact that these values
+originally were URI objects is lost.
+.Sp
+.Vb 4
+\& sub URI::TO_JSON {
+\& my ($uri) = @_;
+\& $uri\->as_string
+\& }
+.Ve
+.ie n .IP "3. ""allow_bignum"" is enabled and the object is a ""Math::BigInt"" or ""Math::BigFloat""." 4
+.el .IP "3. \f(CWallow_bignum\fR is enabled and the object is a \f(CWMath::BigInt\fR or \f(CWMath::BigFloat\fR." 4
+.IX Item "3. allow_bignum is enabled and the object is a Math::BigInt or Math::BigFloat."
+The object will be serialised as a JSON number value.
+.ie n .IP "4. ""allow_blessed"" is enabled." 4
+.el .IP "4. \f(CWallow_blessed\fR is enabled." 4
+.IX Item "4. allow_blessed is enabled."
+The object will be serialised as a JSON null value.
+.IP "5. none of the above" 4
+.IX Item "5. none of the above"
+If none of the settings are enabled or the respective methods are missing,
+\&\f(CW\*(C`JSON::PP\*(C'\fR throws an exception.
+.PP
+\fIDESERIALISATION\fR
+.IX Subsection "DESERIALISATION"
+.PP
+For deserialisation there are only two cases to consider: either
+nonstandard tagging was used, in which case \f(CW\*(C`allow_tags\*(C'\fR decides,
+or objects cannot be automatically be deserialised, in which
+case you can use postprocessing or the \f(CW\*(C`filter_json_object\*(C'\fR or
+\&\f(CW\*(C`filter_json_single_key_object\*(C'\fR callbacks to get some real objects our of
+your JSON.
+.PP
+This section only considers the tagged value case: a tagged JSON object
+is encountered during decoding and \f(CW\*(C`allow_tags\*(C'\fR is disabled, a parse
+error will result (as if tagged values were not part of the grammar).
+.PP
+If \f(CW\*(C`allow_tags\*(C'\fR is enabled, \f(CW\*(C`JSON::PP\*(C'\fR will look up the \f(CW\*(C`THAW\*(C'\fR method
+of the package/classname used during serialisation (it will not attempt
+to load the package as a Perl module). If there is no such method, the
+decoding will fail with an error.
+.PP
+Otherwise, the \f(CW\*(C`THAW\*(C'\fR method is invoked with the classname as first
+argument, the constant string \f(CW\*(C`JSON\*(C'\fR as second argument, and all the
+values from the JSON array (the values originally returned by the
+\&\f(CW\*(C`FREEZE\*(C'\fR method) as remaining arguments.
+.PP
+The method must then return the object. While technically you can return
+any Perl scalar, you might have to enable the \f(CW\*(C`allow_nonref\*(C'\fR setting to
+make that work in all cases, so better return an actual blessed reference.
+.PP
+As an example, let's implement a \f(CW\*(C`THAW\*(C'\fR function that regenerates the
+\&\f(CW\*(C`My::Object\*(C'\fR from the \f(CW\*(C`FREEZE\*(C'\fR example earlier:
+.PP
+.Vb 2
+\& sub My::Object::THAW {
+\& my ($class, $serialiser, $type, $id) = @_;
+\&
+\& $class\->new (type => $type, id => $id)
+\& }
+.Ve
+.SH "ENCODING/CODESET FLAG NOTES"
+.IX Header "ENCODING/CODESET FLAG NOTES"
+This section is taken from JSON::XS.
+.PP
+The interested reader might have seen a number of flags that signify
+encodings or codesets \- \f(CW\*(C`utf8\*(C'\fR, \f(CW\*(C`latin1\*(C'\fR and \f(CW\*(C`ascii\*(C'\fR. There seems to be
+some confusion on what these do, so here is a short comparison:
+.PP
+\&\f(CW\*(C`utf8\*(C'\fR controls whether the JSON text created by \f(CW\*(C`encode\*(C'\fR (and expected
+by \f(CW\*(C`decode\*(C'\fR) is UTF\-8 encoded or not, while \f(CW\*(C`latin1\*(C'\fR and \f(CW\*(C`ascii\*(C'\fR only
+control whether \f(CW\*(C`encode\*(C'\fR escapes character values outside their respective
+codeset range. Neither of these flags conflict with each other, although
+some combinations make less sense than others.
+.PP
+Care has been taken to make all flags symmetrical with respect to
+\&\f(CW\*(C`encode\*(C'\fR and \f(CW\*(C`decode\*(C'\fR, that is, texts encoded with any combination of
+these flag values will be correctly decoded when the same flags are used
+\&\- in general, if you use different flag settings while encoding vs. when
+decoding you likely have a bug somewhere.
+.PP
+Below comes a verbose discussion of these flags. Note that a "codeset" is
+simply an abstract set of character-codepoint pairs, while an encoding
+takes those codepoint numbers and \fIencodes\fR them, in our case into
+octets. Unicode is (among other things) a codeset, UTF\-8 is an encoding,
+and ISO\-8859\-1 (= latin 1) and ASCII are both codesets \fIand\fR encodings at
+the same time, which can be confusing.
+.ie n .IP """utf8"" flag disabled" 4
+.el .IP "\f(CWutf8\fR flag disabled" 4
+.IX Item "utf8 flag disabled"
+When \f(CW\*(C`utf8\*(C'\fR is disabled (the default), then \f(CW\*(C`encode\*(C'\fR/\f(CW\*(C`decode\*(C'\fR generate
+and expect Unicode strings, that is, characters with high ordinal Unicode
+values (> 255) will be encoded as such characters, and likewise such
+characters are decoded as-is, no changes to them will be done, except
+"(re\-)interpreting" them as Unicode codepoints or Unicode characters,
+respectively (to Perl, these are the same thing in strings unless you do
+funny/weird/dumb stuff).
+.Sp
+This is useful when you want to do the encoding yourself (e.g. when you
+want to have UTF\-16 encoded JSON texts) or when some other layer does
+the encoding for you (for example, when printing to a terminal using a
+filehandle that transparently encodes to UTF\-8 you certainly do NOT want
+to UTF\-8 encode your data first and have Perl encode it another time).
+.ie n .IP """utf8"" flag enabled" 4
+.el .IP "\f(CWutf8\fR flag enabled" 4
+.IX Item "utf8 flag enabled"
+If the \f(CW\*(C`utf8\*(C'\fR\-flag is enabled, \f(CW\*(C`encode\*(C'\fR/\f(CW\*(C`decode\*(C'\fR will encode all
+characters using the corresponding UTF\-8 multi-byte sequence, and will
+expect your input strings to be encoded as UTF\-8, that is, no "character"
+of the input string must have any value > 255, as UTF\-8 does not allow
+that.
+.Sp
+The \f(CW\*(C`utf8\*(C'\fR flag therefore switches between two modes: disabled means you
+will get a Unicode string in Perl, enabled means you get an UTF\-8 encoded
+octet/binary string in Perl.
+.ie n .IP """latin1"" or ""ascii"" flags enabled" 4
+.el .IP "\f(CWlatin1\fR or \f(CWascii\fR flags enabled" 4
+.IX Item "latin1 or ascii flags enabled"
+With \f(CW\*(C`latin1\*(C'\fR (or \f(CW\*(C`ascii\*(C'\fR) enabled, \f(CW\*(C`encode\*(C'\fR will escape characters
+with ordinal values > 255 (> 127 with \f(CW\*(C`ascii\*(C'\fR) and encode the remaining
+characters as specified by the \f(CW\*(C`utf8\*(C'\fR flag.
+.Sp
+If \f(CW\*(C`utf8\*(C'\fR is disabled, then the result is also correctly encoded in those
+character sets (as both are proper subsets of Unicode, meaning that a
+Unicode string with all character values < 256 is the same thing as a
+ISO\-8859\-1 string, and a Unicode string with all character values < 128 is
+the same thing as an ASCII string in Perl).
+.Sp
+If \f(CW\*(C`utf8\*(C'\fR is enabled, you still get a correct UTF\-8\-encoded string,
+regardless of these flags, just some more characters will be escaped using
+\&\f(CW\*(C`\euXXXX\*(C'\fR then before.
+.Sp
+Note that ISO\-8859\-1\-\fIencoded\fR strings are not compatible with UTF\-8
+encoding, while ASCII-encoded strings are. That is because the ISO\-8859\-1
+encoding is NOT a subset of UTF\-8 (despite the ISO\-8859\-1 \fIcodeset\fR being
+a subset of Unicode), while ASCII is.
+.Sp
+Surprisingly, \f(CW\*(C`decode\*(C'\fR will ignore these flags and so treat all input
+values as governed by the \f(CW\*(C`utf8\*(C'\fR flag. If it is disabled, this allows you
+to decode ISO\-8859\-1\- and ASCII-encoded strings, as both strict subsets of
+Unicode. If it is enabled, you can correctly decode UTF\-8 encoded strings.
+.Sp
+So neither \f(CW\*(C`latin1\*(C'\fR nor \f(CW\*(C`ascii\*(C'\fR are incompatible with the \f(CW\*(C`utf8\*(C'\fR flag \-
+they only govern when the JSON output engine escapes a character or not.
+.Sp
+The main use for \f(CW\*(C`latin1\*(C'\fR is to relatively efficiently store binary data
+as JSON, at the expense of breaking compatibility with most JSON decoders.
+.Sp
+The main use for \f(CW\*(C`ascii\*(C'\fR is to force the output to not contain characters
+with values > 127, which means you can interpret the resulting string
+as UTF\-8, ISO\-8859\-1, ASCII, KOI8\-R or most about any character set and
+8\-bit\-encoding, and still get the same data structure back. This is useful
+when your channel for JSON transfer is not 8\-bit clean or the encoding
+might be mangled in between (e.g. in mail), and works because ASCII is a
+proper subset of most 8\-bit and multibyte encodings in use in the world.
+.SH BUGS
+.IX Header "BUGS"
+Please report bugs on a specific behavior of this module to RT or GitHub
+issues (preferred):
+.PP
+<https://github.com/makamaka/JSON\-PP/issues>
+.PP
+<https://rt.cpan.org/Public/Dist/Display.html?Queue=JSON\-PP>
+.PP
+As for new features and requests to change common behaviors, please
+ask the author of JSON::XS (Marc Lehmann, <schmorp[at]schmorp.de>)
+first, by email (important!), to keep compatibility among JSON.pm backends.
+.PP
+Generally speaking, if you need something special for you, you are advised
+to create a new module, maybe based on JSON::Tiny, which is smaller and
+written in a much cleaner way than this module.
+.SH "SEE ALSO"
+.IX Header "SEE ALSO"
+The \fIjson_pp\fR command line utility for quick experiments.
+.PP
+JSON::XS, Cpanel::JSON::XS, and JSON::Tiny for faster alternatives.
+JSON and JSON::MaybeXS for easy migration.
+.PP
+JSON::PP::Compat5005 and JSON::PP::Compat5006 for older perl users.
+.PP
+RFC4627 (<http://www.ietf.org/rfc/rfc4627.txt>)
+.PP
+RFC7159 (<http://www.ietf.org/rfc/rfc7159.txt>)
+.PP
+RFC8259 (<http://www.ietf.org/rfc/rfc8259.txt>)
+.SH AUTHOR
+.IX Header "AUTHOR"
+Makamaka Hannyaharamitu, <makamaka[at]cpan.org>
+.SH "CURRENT MAINTAINER"
+.IX Header "CURRENT MAINTAINER"
+Kenichi Ishigaki, <ishigaki[at]cpan.org>
+.SH "COPYRIGHT AND LICENSE"
+.IX Header "COPYRIGHT AND LICENSE"
+Copyright 2007\-2016 by Makamaka Hannyaharamitu
+.PP
+Most of the documentation is taken from JSON::XS by Marc Lehmann
+.PP
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.