Variable type utility for json encoding
# Export type functions by default use JSON; use JSON::Types; print encode_json({ number => number "123", string => string 123, bool => bool "True value", }); # => {"number":123,"string":"123","bool":true} # Non export interface use JSON::Types (); print encode_json({ number => JSON::Types::number "123", string => JSON::Types::string 123, bool => JSON::Types::bool "True value", });
The type mappings between \s-1JSON\s0 and Perl is annoying things. For example,
use JSON;
my $number = 123;
warn "[DEBUG] number:$number\n" if $ENV{DEBUG};
print encode_json([ $number ]);
Output of this code depends on whether \s-1DEBUG\s0 environment is set or not. If set, result is \*(C`[123]\*(C'. If not to set, result is \*(C`["123"]\*(C'. This is normal behaviour on Perl though, it sometimes causes unexpected \s-1JSON\s0 results.
There is a solution about this:
print encode_json([ $number + 0 ]);
This code always outputs \*(C`[123]\*(C'. But the code is a bit ugly and not readable at all.
This module provides some functions to fix this variable types issue:
number $foo; # is always number string $foo; # is always string bool $foo; # is always bool
You can fix above code by using this module like this:
use JSON; use JSON::Types;
my $number = 123;
warn "[DEBUG] number:$number\n" if $ENV{DEBUG};
print encode_json([ number $number ]);
There is three functions and all functions is exported by default.
If you don't want this exported functions, pass empty list to use line:
use JSON::Types ();
You should specify full function name when this case, like \*(C`JSON::Types::number $foo\*(C' or etc.
Passing undefined variable to string and number function is returns undef. If you doesn't prefer this, have to treat this like following:
number $undef_possible_value // 0
This code returns 0 if variable is undef.
Passing not numeric variable to number function is returns 0, but a warning will be occurred.
Daisuke Murase <[email protected]>
Copyright (c) 2012 Daisuke Murase. All rights reserved.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
The full text of the license can be found in the \s-1LICENSE\s0 file included with this module.