Skip to content

Commit

Permalink
smarter number and string detection for Mojo::JSON
Browse files Browse the repository at this point in the history
  • Loading branch information
kraih committed May 12, 2014
1 parent 6517670 commit 44056e2
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 4 deletions.
12 changes: 9 additions & 3 deletions lib/Mojo/JSON.pm
@@ -1,7 +1,6 @@
package Mojo::JSON;
use Mojo::Base -base;

use B;
use Carp 'croak';
use Exporter 'import';
use Mojo::Util;
Expand Down Expand Up @@ -263,8 +262,15 @@ sub _encode_value {
return 'null' unless defined $value;

# Number
my $flags = B::svref_2object(\$value)->FLAGS;
return 0 + $value if $flags & (B::SVp_IOK | B::SVp_NOK) && $value * 0 == 0;
my $num = $value;
{
no warnings 'numeric';
$num += 0;
}
my $str = $value;
$str .= '';
return $num
if ($value ^ '0') ne ($str ^ '0') && $num eq $str && $num * 0 == 0;

# String
return _encode_string($value);
Expand Down
11 changes: 10 additions & 1 deletion t/mojo/json.t
Expand Up @@ -289,9 +289,18 @@ is encode_json({test => [$num, $str]}), '{"test":[3.21,"3.21"]}',
'upgraded number detected';
$str = '0 but true';
$num = 1 + $str;
is encode_json({test => [$num, $str]}), '{"test":[1,0]}',
is encode_json({test => [$num, $str]}), '{"test":[1,"0 but true"]}',
'upgraded number detected';

# Upgraded string
$str = "bar";
{
no warnings 'numeric';
$num = 23 + $str;
}
is encode_json({test => [$num, $str]}), '{"test":[23,"bar"]}',
'upgraded string detected';

# Ensure numbers and strings are not upgraded
my $mixed = [3, 'three', '3', 0, "0"];
is encode_json($mixed), '[3,"three","3",0,"0"]',
Expand Down

0 comments on commit 44056e2

Please sign in to comment.