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.39 by root, Mon Jun 11 02:58:10 2007 UTC vs.
Revision 1.42 by root, Thu Jun 14 23:58:57 2007 UTC

86package JSON::XS; 86package JSON::XS;
87 87
88use strict; 88use strict;
89 89
90BEGIN { 90BEGIN {
91 our $VERSION = '1.23'; 91 our $VERSION = '1.24';
92 our @ISA = qw(Exporter); 92 our @ISA = qw(Exporter);
93 93
94 our @EXPORT = qw(to_json from_json objToJson jsonToObj); 94 our @EXPORT = qw(to_json from_json objToJson jsonToObj);
95 require Exporter; 95 require Exporter;
96 96
614 614
615You often hear that JSON is a subset (or a close subset) of YAML. This is, 615You often hear that JSON is a subset (or a close subset) of YAML. This is,
616however, a mass hysteria and very far from the truth. In general, there is 616however, a mass hysteria and very far from the truth. In general, there is
617no way to configure JSON::XS to output a data structure as valid YAML. 617no way to configure JSON::XS to output a data structure as valid YAML.
618 618
619If you really must use JSON::XS to generate YAML, you should this 619If you really must use JSON::XS to generate YAML, you should use this
620algorithm (subject to change in future versions): 620algorithm (subject to change in future versions):
621 621
622 my $to_yaml = JSON::XS->new->utf8->space_after (1); 622 my $to_yaml = JSON::XS->new->utf8->space_after (1);
623 my $yaml = $to_yaml->encode ($ref) . "\n"; 623 my $yaml = $to_yaml->encode ($ref) . "\n";
624 624
625This will usually generate JSON texts that also parse as valid 625This will usually generate JSON texts that also parse as valid
626YAML. Please note that YAML has hardcoded limits on object key lengths 626YAML. Please note that YAML has hardcoded limits on (simple) object key
627that JSON doesn't have, so you should make sure that your hash keys are 627lengths that JSON doesn't have, so you should make sure that your hash
628noticably shorter than 1024 characters. 628keys are noticably shorter than the 1024 characters YAML allows.
629 629
630There might be other incompatibilities that I am not aware of. In general 630There might be other incompatibilities that I am not aware of. In general
631you should not try to generate YAML with a JSON generator or vice versa, 631you should not try to generate YAML with a JSON generator or vice versa,
632or try to parse JSON with a YAML parser or vice versa. 632or try to parse JSON with a YAML parser or vice versa: chances are high
633that you will run into severe interoperability problems.
633 634
634 635
635=head2 SPEED 636=head2 SPEED
636 637
637It seems that JSON::XS is surprisingly fast, as shown in the following 638It seems that JSON::XS is surprisingly fast, as shown in the following
651shrink). Higher is better: 652shrink). Higher is better:
652 653
653 module | encode | decode | 654 module | encode | decode |
654 -----------|------------|------------| 655 -----------|------------|------------|
655 JSON | 7645.468 | 4208.613 | 656 JSON | 7645.468 | 4208.613 |
656 JSON::DWIW | 68534.379 | 79437.576 | 657 JSON::DWIW | 40721.398 | 77101.176 |
657 JSON::PC | 65948.176 | 78251.940 | 658 JSON::PC | 65948.176 | 78251.940 |
658 JSON::Syck | 23379.621 | 28416.694 | 659 JSON::Syck | 22844.793 | 26479.192 |
659 JSON::XS | 388361.481 | 199728.762 | 660 JSON::XS | 388361.481 | 199728.762 |
660 JSON::XS/2 | 218453.333 | 192399.266 | 661 JSON::XS/2 | 218453.333 | 192399.266 |
661 JSON::XS/3 | 338250.323 | 192399.266 | 662 JSON::XS/3 | 338250.323 | 192399.266 |
662 Storable | 15732.573 | 28571.553 | 663 Storable | 15779.925 | 14169.946 |
663 -----------+------------+------------+ 664 -----------+------------+------------+
664 665
665That is, JSON::XS is about five times faster than JSON::DWIW on encoding, 666That is, JSON::XS is about five times faster than JSON::DWIW on encoding,
666about three times faster on decoding, and over fourty times faster 667about three times faster on decoding, and over fourty times faster
667than JSON, even with pretty-printing and key sorting. It also compares 668than JSON, even with pretty-printing and key sorting. It also compares
671search API (http://nanoref.com/yahooapis/mgPdGg): 672search API (http://nanoref.com/yahooapis/mgPdGg):
672 673
673 module | encode | decode | 674 module | encode | decode |
674 -----------|------------|------------| 675 -----------|------------|------------|
675 JSON | 254.685 | 37.665 | 676 JSON | 254.685 | 37.665 |
676 JSON::DWIW | 1014.244 | 1087.678 | 677 JSON::DWIW | 843.343 | 1049.731 |
677 JSON::PC | 3602.116 | 2307.352 | 678 JSON::PC | 3602.116 | 2307.352 |
678 JSON::Syck | 558.035 | 776.263 | 679 JSON::Syck | 505.107 | 787.899 |
679 JSON::XS | 5747.196 | 3543.684 | 680 JSON::XS | 5747.196 | 3690.220 |
680 JSON::XS/2 | 3968.121 | 3589.170 | 681 JSON::XS/2 | 3968.121 | 3676.634 |
681 JSON::XS/3 | 6105.246 | 3561.134 | 682 JSON::XS/3 | 6105.246 | 3662.508 |
682 Storable | 4456.337 | 5320.020 | 683 Storable | 4417.337 | 5285.161 |
683 -----------+------------+------------+ 684 -----------+------------+------------+
684 685
685Again, JSON::XS leads by far. 686Again, JSON::XS leads by far (except for Storable which non-surprisingly
687decodes faster).
686 688
687On large strings containing lots of high unicode characters, some modules 689On large strings containing lots of high unicode characters, some modules
688(such as JSON::PC) seem to decode faster than JSON::XS, but the result 690(such as JSON::PC) seem to decode faster than JSON::XS, but the result
689will be broken due to missing (or wrong) unicode handling. Others refuse 691will be broken due to missing (or wrong) unicode handling. Others refuse
690to decode or encode properly, so it was impossible to prepare a fair 692to decode or encode properly, so it was impossible to prepare a fair
718 720
719And last but least, something else could bomb you that I forgot to think 721And last but least, something else could bomb you that I forgot to think
720of. In that case, you get to keep the pieces. I am always open for hints, 722of. In that case, you get to keep the pieces. I am always open for hints,
721though... 723though...
722 724
725If you are using JSON::XS to return packets to consumption
726by javascript scripts in a browser you should have a look at
727L<http://jpsykes.com/47/practical-csrf-and-json-security> to see wether
728you are vulnerable to some common attack vectors (which really are browser
729design bugs, but it is still you who will have to deal with it, as major
730browser developers care only for features, not about doing security
731right).
732
723 733
724=head1 BUGS 734=head1 BUGS
725 735
726While the goal of this module is to be correct, that unfortunately does 736While the goal of this module is to be correct, that unfortunately does
727not mean its bug-free, only that I think its design is bug-free. It is 737not mean its bug-free, only that I think its design is bug-free. It is

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines