NAME
Mojo::JSON::MaybeXS - use JSON::MaybeXS as the JSON encoder for Mojolicious
SYNOPSIS
use Mojo::JSON::MaybeXS;
use Mojo::JSON qw/encode_json decode_json true false/;
package My::Mojo::App;
use Mojo::JSON::MaybeXS;
use Mojo::Base 'Mojolicious';
DESCRIPTION
Mojo::JSON::MaybeXS is a monkey-patch module for using JSON::MaybeXS in place of Mojo::JSON in a Mojolicious application. It must be loaded before Mojo::JSON so the new functions will be properly exported.
CAVEATS
JSON::MaybeXS may load different modules depending on what is available, and these modules have slightly different behavior from Mojo::JSON and occasionally from each other. As of this writing, the author has found the following incompatibilities:
Boolean Stringification
If Cpanel::JSON::XS is loaded by JSON::MaybeXS (the default if available), the "true" in Mojo::JSON and "false" in Mojo::JSON booleans will stringify to "true"
and "false"
. However, when using JSON::XS, or JSON::PP, they will stringify to "1"
or "0"
, like in Mojo::JSON.
print Mojo::JSON::false;
# JSON::XS, JSON::PP, or Mojo::JSON: 0
# Cpanel::JSON::XS: false
Object Conversion
Both JSON::MaybeXS and Mojo::JSON will attempt to call the TO_JSON method of a blessed reference to produce a JSON-friendly structure. If that method does not exist, JSON::MaybeXS will encode the object to null
, while Mojo::JSON will stringify the object.
print encode_json([DateTime->now]);
# Mojo::JSON: ["2014-11-30T04:31:13"]
# JSON::MaybeXS: [null]
Unblessed References
JSON::MaybeXS does not allow unblessed references other than hash and array references or references to the integers 0
and 1
, and will throw an exception if attempting to encode one. Mojo::JSON will treat scalar references as references to 0
or 1
and will encode them to true
or false
.
print encode_json([\'asdf']);
# Mojo::JSON: [true]
# JSON::MaybeXS: dies
Escapes
Mojo::JSON currently escapes the slash character /
for security reasons, as well as the unicode characters u2028
and u2029
, while JSON::MaybeXS does not. This does not affect decoding of the resulting JSON.
print encode_json(["/\x{2028}/\x{2029"]);
# Mojo::JSON: ["\/\u2028\/\u2029"]
# JSON::MaybeXS: ["/ / "]
# Both decode to arrayref containing: "/\x{2028}/\x{2029}"
inf and nan
Mojo::JSON encodes inf
and nan
to strings, whereas JSON::MaybeXS will encode them as numbers (barewords) producing invalid JSON.
print encode_json([9**9**9, -sin 9**9**9]);
# Mojo::JSON: ["inf","nan"]
# JSON::MaybeXS: [inf,nan]
Upgraded Numbers
JSON::MaybeXS will attempt to guess if a value to be encoded is numeric or string based on its last usage. Therefore, using a variable containing 13
in a string will cause it to be encoded as "13"
even if the variable itself was not changed. Mojo::JSON will encode 13
as 13
regardless of whether it has been used as a string.
my ($num1, $num2) = (13, 14);
my $str = "$num1";
print encode_json([$num1, $num2, $str]);
# Mojo::JSON: [13,14,"13"]
# JSON::MaybeXS: ["13",14,"13"]
BUGS
This is a monkey-patch of one of a few possible modules into another, and they have incompatibilities, so there will probably be bugs. Report any issues on the public bugtracker.
AUTHOR
Dan Book, dbook@cpan.org
CREDITS
Sebastian Riedel, author of Mojolicious, for basic implementation.
COPYRIGHT AND LICENSE
Copyright 2014, Dan Book.
This library is free software; you may redistribute it and/or modify it under the terms of the Artistic License version 2.0.
SEE ALSO
Mojo::JSON, JSON::MaybeXS, Cpanel::JSON::XS, JSON::XS, JSON::PP