--- JSON-XS/XS.pm 2007/03/23 16:00:19 1.9 +++ JSON-XS/XS.pm 2007/03/23 17:40:29 1.10 @@ -20,13 +20,17 @@ See COMPARISON, below, for a comparison to some other JSON modules. +See MAPPING, below, on how JSON::XS maps perl values to JSON values and +vice versa. + =head2 FEATURES =over 4 =item * correct handling of unicode issues -This module knows how to handle Unicode, and even documents how it does so. +This module knows how to handle Unicode, and even documents how and when +it does so. =item * round-trip integrity @@ -37,11 +41,13 @@ =item * strict checking of JSON correctness There is no guessing, no generating of illegal JSON strings by default, -and only JSON is accepted as input (the latter is a security feature). +and only JSON is accepted as input by default (the latter is a security +feature). =item * fast -compared to other JSON modules, this module compares favourably. +Compared to other JSON modules, this module compares favourably in terms +of speed, too. =item * simple to use @@ -50,8 +56,10 @@ =item * reasonably versatile output formats -You can choose between the most compact format possible, a pure-ascii -format, or a pretty-printed format. Or you can combine those features in +You can choose between the most compact guarenteed single-line format +possible (nice for simple line-based protocols), a pure-ascii format (for +when your transport is not 8-bit clean), or a pretty-printed format (for +when you want to read that stuff). Or you can combine those features in whatever way you like. =back @@ -84,8 +92,7 @@ a hash or array) to a UTF-8 encoded, binary string (that is, the string contains octets only). Croaks on error. -This function call is functionally identical to C<< JSON::XS->new->utf8 -(1)->encode ($perl_scalar) >>. +This function call is functionally identical to C<< JSON::XS->new->utf8->encode ($perl_scalar) >>. =item $perl_scalar = from_json $json_string @@ -93,8 +100,7 @@ parse that as an UTF-8 encoded JSON string, returning the resulting simple scalar or reference. Croaks on error. -This function call is functionally identical to C<< JSON::XS->new->utf8 -(1)->decode ($json_string) >>. +This function call is functionally identical to C<< JSON::XS->new->utf8->decode ($json_string) >>. =back @@ -261,6 +267,122 @@ =back +=head1 MAPPING + +This section describes how JSON::XS 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). + +For the more enlightened: note that in the following descriptions, +lowercase I refers to the Perl interpreter, while uppcercase I +refers to the abstract Perl language itself. + +=head2 JSON -> PERL + +=over 4 + +=item object + +A JSON object becomes a reference to a hash in Perl. No ordering of object +keys is preserved. + +=item array + +A JSON array becomes a reference to an array in Perl. + +=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. + +=item number + +A JSON number becomes either an integer or numeric (floating point) +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. + +=item true, false + +These JSON atoms become C<0>, C<1>, respectively. Information is lost in +this process. Future versions might represent those values differently, +but they will be guarenteed to act like these integers would normally in +Perl. + +=item null + +A JSON null atom becomes C in Perl. + +=back + +=head2 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. + +=over 4 + +=item hash references + +Perl hash references become JSON objects. As there is no inherent ordering +in hash keys, they will usually be encoded in a pseudo-random order that +can change between runs of the same program but stays generally the same +within the single run of a program. JSON::XS can optionally sort the hash +keys (determined by the I flag), so the same datastructure +will serialise to the same JSON text (given same settings and version of +JSON::XS), but this incurs a runtime overhead. + +=item array references + +Perl array references become JSON arrays. + +=item blessed objects + +Blessed objects are not allowed. JSON::XS currently tries to encode their +underlying representation (hash- or arrayref), but this behaviour might +change in future versions. + +=item simple scalars + +Simple Perl scalars (any scalar that is not a reference) are the most +difficult objects to encode: JSON::XS will encode undefined scalars as +JSON null value, scalars that have last been used in a string context +before encoding as JSON strings and anything else as number value: + + # dump as number + to_json [2] # yields [2] + to_json [-3.0e17] # yields [-3e+17] + my $value = 5; to_json [$value] # yields [5] + + # used as string, so dump as string + print $value; + to_json [$value] # yields ["5"] + + # undef becomes null + to_json [undef] # yields [null] + +You can force the type to be a string by stringifying it: + + 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 + +You can force the type to be a number by numifying it: + + 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 choise is yours. + +You can not currently output JSON booleans or force the type in other, +less obscure, ways. Tell me if you need this capability. + +=back + =head1 COMPARISON As already mentioned, this module was created because none of the existing