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.116 by root, Tue Feb 17 23:41:20 2009 UTC vs.
Revision 1.121 by root, Mon Jul 13 22:13:17 2009 UTC

99 99
100=cut 100=cut
101 101
102package JSON::XS; 102package JSON::XS;
103 103
104no warnings; 104use common::sense;
105use strict;
106 105
107our $VERSION = '2.232'; 106our $VERSION = '2.24';
108our @ISA = qw(Exporter); 107our @ISA = qw(Exporter);
109 108
110our @EXPORT = qw(encode_json decode_json to_json from_json); 109our @EXPORT = qw(encode_json decode_json to_json from_json);
111 110
112sub to_json($) { 111sub to_json($) {
1209 use JSON::XS; 1208 use JSON::XS;
1210 1209
1211 print encode_json [chr 0x2028]; 1210 print encode_json [chr 0x2028];
1212 1211
1213The right fix for this is to use a proper JSON parser in your javascript 1212The right fix for this is to use a proper JSON parser in your javascript
1214programs, and not rely on C<eval>. 1213programs, and not rely on C<eval> (see for example Douglas Crockford's
1214F<json2.js> parser).
1215 1215
1216If this is not an option, you can, as a stop-gap measure, simply encode to 1216If this is not an option, you can, as a stop-gap measure, simply encode to
1217ASCII-only JSON: 1217ASCII-only JSON:
1218 1218
1219 use JSON::XS; 1219 use JSON::XS;
1220 1220
1221 print JSON::XS->new->ascii->encode ([chr 0x2028]); 1221 print JSON::XS->new->ascii->encode ([chr 0x2028]);
1222 1222
1223And if you are concerned about the size of the resulting JSON text, you 1223Note that this will enlarge the resulting JSON text quite a bit if you
1224can run some regexes to only escape U+2028 and U+2029: 1224have many non-ASCII characters. You might be tempted to run some regexes
1225to only escape U+2028 and U+2029, e.g.:
1225 1226
1226 use JSON::XS; 1227 # DO NOT USE THIS!
1227
1228 my $json = JSON::XS->new->utf8->encode ([chr 0x2028]); 1228 my $json = JSON::XS->new->utf8->encode ([chr 0x2028]);
1229 $json =~ s/\xe2\x80\xa8/\\u2028/g; # escape U+2028 1229 $json =~ s/\xe2\x80\xa8/\\u2028/g; # escape U+2028
1230 $json =~ s/\xe2\x80\xa9/\\u2029/g; # escape U+2029 1230 $json =~ s/\xe2\x80\xa9/\\u2029/g; # escape U+2029
1231 print $json; 1231 print $json;
1232 1232
1233This works because U+2028/U+2029 are not allowed outside of strings and 1233Note that I<this is a bad idea>: the above only works for U+2028 and
1234are not used for syntax, so replacing them unconditionally just works.
1235
1236Note, however, that fixing the broken JSON parser is better than working
1237around it in every other generator. The above regexes should work well in
1238other languages, as long as they operate on UTF-8. It is equally valid to
1239replace all occurences of U+2028/2029 directly by their \\u-escaped forms
1240in unicode texts, so they can simply be used to fix any parsers relying on
1241C<eval> by first applying the regexes on the encoded texts.
1242
1243Note also that the above only works for U+2028 and U+2029 and thus
1244only for fully ECMAscript-compliant parsers. Many existing javascript 1234U+2029 and thus only for fully ECMAscript-compliant parsers. Many existing
1245implementations misparse other characters as well. Best rely on a good 1235javascript implementations, however, have issues with other characters as
1246JSON parser, such as Douglas Crockfords F<json2.js>, which escapes the 1236well - using C<eval> naively simply I<will> cause problems.
1247above and many more problematic characters properly before passing them
1248into C<eval>.
1249 1237
1250Another problem is that some javascript implementations reserve 1238Another problem is that some javascript implementations reserve
1251some property names for their own purposes (which probably makes 1239some property names for their own purposes (which probably makes
1252them non-ECMAscript-compliant). For example, Iceweasel reserves the 1240them non-ECMAscript-compliant). For example, Iceweasel reserves the
1253C<__proto__> property name for it's own purposes. 1241C<__proto__> property name for it's own purposes.

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines