-
-
Save anonymous/f35b12dfbc306020a858 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/lib/Mojo/JSON.pm b/lib/Mojo/JSON.pm | |
index 8bd4373..027120f 100644 | |
--- a/lib/Mojo/JSON.pm | |
+++ b/lib/Mojo/JSON.pm | |
@@ -9,7 +9,7 @@ use Scalar::Util 'blessed'; | |
has 'error'; | |
-our @EXPORT_OK = qw(decode_json encode_json j); | |
+our @EXPORT_OK = qw(decode_json encode_json encode_json_text j); | |
# Literal names | |
my $FALSE = bless \(my $false = 0), 'Mojo::JSON::_Bool'; | |
@@ -48,6 +48,8 @@ sub encode { encode_json($_[1]) } | |
sub encode_json { Mojo::Util::encode 'UTF-8', _encode_value(shift) } | |
+sub encode_json_text { _encode_value(shift) } | |
+ | |
sub false {$FALSE} | |
sub j { | |
@@ -64,12 +66,8 @@ sub _decode { | |
# Missing input | |
die "Missing or empty input\n" unless length(my $bytes = shift); | |
- # Wide characters | |
- die "Wide character in input\n" unless utf8::downgrade($bytes, 1); | |
- | |
# UTF-8 | |
- die "Input is not UTF-8 encoded\n" | |
- unless defined(local $_ = Mojo::Util::decode('UTF-8', $bytes)); | |
+ local $_ = Mojo::Util::decode('UTF-8', $bytes) // $bytes; | |
# Value | |
my $value = _decode_value(); | |
@@ -359,6 +357,12 @@ Decode JSON to Perl value and die if decoding fails. | |
Encode Perl value to JSON. | |
+=head2 encode_json_text | |
+ | |
+ my $chars = encode_json_text({foo => 'bar'}); | |
+ | |
+Encode Perl value to JSON characters. | |
+ | |
=head2 j | |
my $bytes = j([1, 2, 3]); | |
diff --git a/t/mojo/json.t b/t/mojo/json.t | |
index 2ae25ca..840c12c 100644 | |
--- a/t/mojo/json.t | |
+++ b/t/mojo/json.t | |
@@ -10,7 +10,7 @@ use Mojo::Base -strict; | |
use Test::More; | |
use Mojo::ByteStream 'b'; | |
-use Mojo::JSON qw(decode_json encode_json j); | |
+use Mojo::JSON qw(decode_json encode_json encode_json_text j); | |
use Mojo::Util 'encode'; | |
use Scalar::Util 'dualvar'; | |
@@ -250,6 +250,10 @@ is index($bytes, b("\x{2029}")->encode), -1, 'properly esca | |
is_deeply decode_json($bytes), ["\x{2028}test\x{2029}123"], | |
'successful roundtrip'; | |
+# Wide characters | |
+is_deeply decode_json('["♥"]'), ['♥'], 'wide characters decoded'; | |
+is encode_json_text(['♥']), '["♥"]', 'wide characters encoded'; | |
+ | |
# Blessed reference | |
$bytes = encode_json [b('test')]; | |
is_deeply decode_json($bytes), ['test'], 'successful roundtrip'; | |
@@ -326,8 +330,6 @@ is j('null'), undef, 'decode null'; | |
is $json->decode('test'), undef, 'syntax error'; | |
is $json->error, 'Malformed JSON: Expected string, array, object, number,' | |
. ' boolean or null at line 0, offset 0', 'right error'; | |
-is $json->decode('["♥"]'), undef, 'wide character in input'; | |
-is $json->error, 'Wide character in input', 'right error'; | |
is $json->decode(b('["\\ud800"]')->encode), undef, 'syntax error'; | |
is $json->error, 'Malformed JSON: Missing low-surrogate at line 1, offset 8', | |
'right error'; | |
@@ -375,7 +377,8 @@ is $json->decode("[\"foo\",\n\"bar\",\n\"bazra\"]lalala"), u | |
is $json->error, 'Malformed JSON: Unexpected data at line 3, offset 8', | |
'right error'; | |
is $json->decode(encode('Shift_JIS', 'やった')), undef, 'invalid encoding'; | |
-is $json->error, 'Input is not UTF-8 encoded', 'right error'; | |
+is $json->error, 'Malformed JSON: Expected string, array, object, number,' | |
+ . ' boolean or null at line 0, offset 0', 'right error'; | |
is j('{'), undef, 'syntax error'; | |
eval { decode_json("[\"foo\",\n\"bar\",\n\"bazra\"]lalala") }; | |
like $@, qr/JSON: Unexpected data at line 3, offset 8 at.*json\.t/, |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment