ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/JSON-XS/XS.pm
(Generate patch)

Comparing JSON-XS/XS.pm (file contents):
Revision 1.17 by root, Sat Mar 24 19:42:14 2007 UTC vs.
Revision 1.23 by root, Sun Mar 25 21:19:13 2007 UTC

4 4
5=head1 SYNOPSIS 5=head1 SYNOPSIS
6 6
7 use JSON::XS; 7 use JSON::XS;
8 8
9 # exported functions, croak on error 9 # exported functions, they croak on error
10 # and expect/generate UTF-8
10 11
11 $utf8_encoded_json_text = to_json $perl_hash_or_arrayref; 12 $utf8_encoded_json_text = to_json $perl_hash_or_arrayref;
12 $perl_hash_or_arrayref = from_json $utf8_encoded_json_text; 13 $perl_hash_or_arrayref = from_json $utf8_encoded_json_text;
13 14
15 # objToJson and jsonToObj aliases to to_json and from_json
16 # are exported for compatibility to the JSON module,
17 # but should not be used in new code.
18
14 # oo-interface 19 # OO-interface
15 20
16 $coder = JSON::XS->new->ascii->pretty->allow_nonref; 21 $coder = JSON::XS->new->ascii->pretty->allow_nonref;
17 $pretty_printed_unencoded = $coder->encode ($perl_scalar); 22 $pretty_printed_unencoded = $coder->encode ($perl_scalar);
18 $perl_scalar = $coder->decode ($unicode_json_text); 23 $perl_scalar = $coder->decode ($unicode_json_text);
19 24
36 41
37=head2 FEATURES 42=head2 FEATURES
38 43
39=over 4 44=over 4
40 45
41=item * correct handling of unicode issues 46=item * correct unicode handling
42 47
43This module knows how to handle Unicode, and even documents how and when 48This module knows how to handle Unicode, and even documents how and when
44it does so. 49it does so.
45 50
46=item * round-trip integrity 51=item * round-trip integrity
47 52
48When you serialise a perl data structure using only datatypes supported 53When you serialise a perl data structure using only datatypes supported
49by JSON, the deserialised data structure is identical on the Perl level. 54by JSON, the deserialised data structure is identical on the Perl level.
50(e.g. the string "2.0" doesn't suddenly become "2"). 55(e.g. the string "2.0" doesn't suddenly become "2" just because it looks
56like a number).
51 57
52=item * strict checking of JSON correctness 58=item * strict checking of JSON correctness
53 59
54There is no guessing, no generating of illegal JSON texts by default, 60There is no guessing, no generating of illegal JSON texts by default,
55and only JSON is accepted as input by default (the latter is a security 61and only JSON is accepted as input by default (the latter is a security
66interface. 72interface.
67 73
68=item * reasonably versatile output formats 74=item * reasonably versatile output formats
69 75
70You can choose between the most compact guarenteed single-line format 76You can choose between the most compact guarenteed single-line format
71possible (nice for simple line-based protocols), a pure-ascii format (for 77possible (nice for simple line-based protocols), a pure-ascii format
72when your transport is not 8-bit clean), or a pretty-printed format (for 78(for when your transport is not 8-bit clean, still supports the whole
73when you want to read that stuff). Or you can combine those features in 79unicode range), or a pretty-printed format (for when you want to read that
74whatever way you like. 80stuff). Or you can combine those features in whatever way you like.
75 81
76=back 82=back
77 83
78=cut 84=cut
79 85
80package JSON::XS; 86package JSON::XS;
81 87
88use strict;
89
82BEGIN { 90BEGIN {
83 $VERSION = '0.5'; 91 our $VERSION = '0.8';
84 @ISA = qw(Exporter); 92 our @ISA = qw(Exporter);
85 93
86 @EXPORT = qw(to_json from_json); 94 our @EXPORT = qw(to_json from_json objToJson jsonToObj);
87 require Exporter; 95 require Exporter;
88 96
89 require XSLoader; 97 require XSLoader;
90 XSLoader::load JSON::XS::, $VERSION; 98 XSLoader::load JSON::XS::, $VERSION;
91} 99}
120 $perl_scalar = JSON::XS->new->utf8->decode ($json_text) 128 $perl_scalar = JSON::XS->new->utf8->decode ($json_text)
121 129
122except being faster. 130except being faster.
123 131
124=back 132=back
133
125 134
126=head1 OBJECT-ORIENTED INTERFACE 135=head1 OBJECT-ORIENTED INTERFACE
127 136
128The object oriented interface lets you configure your own encoding or 137The object oriented interface lets you configure your own encoding or
129decoding style, within the limits of supported formats. 138decoding style, within the limits of supported formats.
293 302
294In the future, this setting might control other things, such as converting 303In the future, this setting might control other things, such as converting
295strings that look like integers or floats into integers or floats 304strings that look like integers or floats into integers or floats
296internally (there is no difference on the Perl level), saving space. 305internally (there is no difference on the Perl level), saving space.
297 306
307=item $json = $json->max_depth ([$maximum_nesting_depth])
308
309Sets the maximum nesting level (default C<8192>) accepted while encoding
310or decoding. If the JSON text or Perl data structure has an equal or
311higher nesting level then this limit, then the encoder and decoder will
312stop and croak at that point.
313
314Nesting level is defined by number of hash- or arrayrefs that the encoder
315needs to traverse to reach a given point or the number of C<{> or C<[>
316characters without their matching closing parenthesis crossed to reach a
317given character in a string.
318
319Setting the maximum depth to one disallows any nesting, so that ensures
320that the object is only a single hash/object or array.
321
322The argument to C<max_depth> will be rounded up to the next nearest power
323of two.
324
325See SECURITY CONSIDERATIONS, below, for more info on why this is useful.
326
298=item $json_text = $json->encode ($perl_scalar) 327=item $json_text = $json->encode ($perl_scalar)
299 328
300Converts the given Perl data structure (a simple scalar or a reference 329Converts the given Perl data structure (a simple scalar or a reference
301to a hash or array) to its JSON representation. Simple scalars will be 330to a hash or array) to its JSON representation. Simple scalars will be
302converted into JSON string or number sequences, while references to arrays 331converted into JSON string or number sequences, while references to arrays
312JSON numbers and strings become simple Perl scalars. JSON arrays become 341JSON numbers and strings become simple Perl scalars. JSON arrays become
313Perl arrayrefs and JSON objects become Perl hashrefs. C<true> becomes 342Perl arrayrefs and JSON objects become Perl hashrefs. C<true> becomes
314C<1>, C<false> becomes C<0> and C<null> becomes C<undef>. 343C<1>, C<false> becomes C<0> and C<null> becomes C<undef>.
315 344
316=back 345=back
346
317 347
318=head1 MAPPING 348=head1 MAPPING
319 349
320This section describes how JSON::XS maps Perl values to JSON values and 350This section describes how JSON::XS maps Perl values to JSON values and
321vice versa. These mappings are designed to "do the right thing" in most 351vice versa. These mappings are designed to "do the right thing" in most
433 463
434Those will be encoded until memory or stackspace runs out. 464Those will be encoded until memory or stackspace runs out.
435 465
436=back 466=back
437 467
468
438=head1 COMPARISON 469=head1 COMPARISON
439 470
440As already mentioned, this module was created because none of the existing 471As already mentioned, this module was created because none of the existing
441JSON modules could be made to work correctly. First I will describe the 472JSON modules could be made to work correctly. First I will describe the
442problems (or pleasures) I encountered with various existing JSON modules, 473problems (or pleasures) I encountered with various existing JSON modules,
527tables. They have been generated with the help of the C<eg/bench> program 558tables. They have been generated with the help of the C<eg/bench> program
528in the JSON::XS distribution, to make it easy to compare on your own 559in the JSON::XS distribution, to make it easy to compare on your own
529system. 560system.
530 561
531First comes a comparison between various modules using a very short JSON 562First comes a comparison between various modules using a very short JSON
532string (83 bytes), showing the number of encodes/decodes per second 563string:
533(JSON::XS is the functional interface, while JSON::XS/2 is the OO 564
565 {"method": "handleMessage", "params": ["user1", "we were just talking"], "id": null}
566
567It shows the number of encodes/decodes per second (JSON::XS uses the
568functional interface, while JSON::XS/2 uses the OO interface with
534interface with pretty-printing and hashkey sorting enabled). Higher is 569pretty-printing and hashkey sorting enabled). Higher is better:
535better:
536 570
537 module | encode | decode | 571 module | encode | decode |
538 -----------|------------|------------| 572 -----------|------------|------------|
539 JSON | 14006 | 6820 | 573 JSON | 11488.516 | 7823.035 |
540 JSON::DWIW | 200937 | 120386 | 574 JSON::DWIW | 94708.054 | 129094.260 |
541 JSON::PC | 85065 | 129366 | 575 JSON::PC | 63884.157 | 128528.212 |
542 JSON::Syck | 59898 | 44232 | 576 JSON::Syck | 34898.677 | 42096.911 |
543 JSON::XS | 1171478 | 342435 | 577 JSON::XS | 654027.064 | 396423.669 |
544 JSON::XS/2 | 730760 | 328714 | 578 JSON::XS/2 | 371564.190 | 371725.613 |
545 -----------+------------+------------+ 579 -----------+------------+------------+
546 580
547That is, JSON::XS is 6 times faster than than JSON::DWIW and about 80 581That is, JSON::XS is more than six times faster than JSON::DWIW on
582encoding, more than three times faster on decoding, and about thirty times
548times faster than JSON, even with pretty-printing and key sorting. 583faster than JSON, even with pretty-printing and key sorting.
549 584
550Using a longer test string (roughly 18KB, generated from Yahoo! Locals 585Using a longer test string (roughly 18KB, generated from Yahoo! Locals
551search API (http://nanoref.com/yahooapis/mgPdGg): 586search API (http://nanoref.com/yahooapis/mgPdGg):
552 587
553 module | encode | decode | 588 module | encode | decode |
554 -----------|------------|------------| 589 -----------|------------|------------|
555 JSON | 673 | 38 | 590 JSON | 273.023 | 44.674 |
556 JSON::DWIW | 5271 | 770 | 591 JSON::DWIW | 1089.383 | 1145.704 |
557 JSON::PC | 9901 | 2491 | 592 JSON::PC | 3097.419 | 2393.921 |
558 JSON::Syck | 2360 | 786 | 593 JSON::Syck | 514.060 | 843.053 |
559 JSON::XS | 37398 | 3202 | 594 JSON::XS | 6479.668 | 3636.364 |
560 JSON::XS/2 | 13765 | 3153 | 595 JSON::XS/2 | 3774.221 | 3599.124 |
561 -----------+------------+------------+ 596 -----------+------------+------------+
562 597
563Again, JSON::XS leads by far in the encoding case, while still beating 598Again, JSON::XS leads by far.
564every other module in the decoding case.
565 599
566On large strings containing lots of unicode characters, some modules 600On large strings containing lots of high unicode characters, some modules
567(such as JSON::PC) decode faster than JSON::XS, but the result will be 601(such as JSON::PC) seem to decode faster than JSON::XS, but the result
568broken due to missing unicode handling. Others refuse to decode or encode 602will be broken due to missing (or wrong) unicode handling. Others refuse
569properly, so it was impossible to prepare a fair comparison table for that 603to decode or encode properly, so it was impossible to prepare a fair
570case. 604comparison table for that case.
571 605
572=head1 RESOURCE LIMITS
573 606
574JSON::XS does not impose any limits on the size of JSON texts or Perl 607=head1 SECURITY CONSIDERATIONS
575values they represent - if your machine can handle it, JSON::XS will 608
576encode or decode it. Future versions might optionally impose structure 609When you are using JSON in a protocol, talking to untrusted potentially
577depth and memory use resource limits. 610hostile creatures requires relatively few measures.
611
612First of all, your JSON decoder should be secure, that is, should not have
613any buffer overflows. Obviously, this module should ensure that and I am
614trying hard on making that true, but you never know.
615
616Second, you need to avoid resource-starving attacks. That means you should
617limit the size of JSON texts you accept, or make sure then when your
618resources run out, thats just fine (e.g. by using a separate process that
619can crash safely). The size of a JSON text in octets or characters is
620usually a good indication of the size of the resources required to decode
621it into a Perl structure.
622
623Third, JSON::XS recurses using the C stack when decoding objects and
624arrays. The C stack is a limited resource: for instance, on my amd64
625machine with 8MB of stack size I can decode around 180k nested arrays
626but only 14k nested JSON objects. If that is exceeded, the program
627crashes. Thats why the default nesting limit is set to 8192. If your
628process has a smaller stack, you should adjust this setting accordingly
629with the C<max_depth> method.
630
631And last but least, something else could bomb you that I forgot to think
632of. In that case, you get to keep the pieces. I am alway sopen for hints,
633though...
634
578 635
579=head1 BUGS 636=head1 BUGS
580 637
581While the goal of this module is to be correct, that unfortunately does 638While the goal of this module is to be correct, that unfortunately does
582not mean its bug-free, only that I think its design is bug-free. It is 639not mean its bug-free, only that I think its design is bug-free. It is
583still very young and not well-tested. If you keep reporting bugs they will 640still relatively early in its development. If you keep reporting bugs they
584be fixed swiftly, though. 641will be fixed swiftly, though.
585 642
586=cut 643=cut
587 644
5881; 6451;
589 646

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines