NAME
JSON::TypeEncoder - serialize JSON using type information
SYNOPSIS
use JSON::TypeEncoder;
use Types::Standard -types;
my $type = Dict[a => Str, b => Int, c => Bool];
my $jsont = JSON::TypeEncoder->new;
my $encode = $jsont->encoder($type);
$encode->({ a => 'foo', b => 30, c => !!1 });
# => {"a":"foo","b":30,"c":true}
DESCRIPTION
JSON::TypeEncoder serialize Perl data structures to JSON using type information. This module goal is to be correct and fast.
FEATURES
Correct
This module encodes according to the specified type information. For example, it encodes as following:
use JSON::TypeEncoder;
use Types::Standard -types;
my $jsont = JSON::TypeEncoder->new;
my $s = $jsont->encoder(Dict[a => Str]);
$s->({a => 123}); # => {"a":"123"}
my $i = $jsont->encoder(Dict[a => Int]);
$i->({a => 123}); # => {"a":123}
my $b = $jsont->encoder(Dict[a => Bool]);
$b->({a => !!0}); # => {"a":false}
This will prevent unintended encoding.
Fast
Encoding performance is improved by string eval using type information. You can get speed comparable to JSON::XS. The results of a simple benchmark is as following.
First comes a comparison using a very short single-line JSON string (also available at http://dist.schmorp.de/misc/json/short.json).
{"method": "handleMessage", "params": ["user1", "we were just talking"], "id": null, "array":[1,11,234,-5,1e5,1e7, 1, 0]}
It shows the number of encodes per second. Higher is better:
# Rate JSON::PP JSON::XS w/ Types JSON::TypeEncoder JSON::XS
# JSON::PP 39739/s -- -83% -90% -95%
# JSON::XS w/ Types 234056/s 489% -- -42% -72%
# JSON::TypeEncoder 405736/s 921% 73% -- -51%
# JSON::XS 825118/s 1976% 253% 103% --
Using a longer test string (roughly 18KB, generated from Yahoo! Locals search API (http://dist.schmorp.de/misc/json/long.json).
# Rate JSON::PP JSON::XS JSON::TypeEncoder
# JSON::PP 984/s -- -96% -97%
# JSON::XS 26946/s 2639% -- -13%
# JSON::TypeEncoder 30919/s 3043% 15% --
Pure Perl
This module is written by pure Perl. So you can easily install it.
NOT FEATURES
This module NOT supports decode JSON to Perl data structures. You should use other modules like JSON::XS to decode.
TYPE SPECIFICATION
Types::Standard is used for type specification. The basic types are as follows, you can specify the type of JSON by this combination.
Basic Types
Str-
Subtype of
Strencodes always to string.my $encode = $jsont->encoder(Str); $encode->(123) # => "123" Num-
Subtype of
Numencodes always to number.my $encode = $jsont->encoder(Num); $encode->(123) # => 123 Bool-
Subtype of
Boolencodes always to boolean.my $encode = $jsont->encoder(Bool); $encode->(123) # => true Dict[...]-
Subtype of
Dict[...]encodes always to map.my $encode = $jsont->encoder(Dict[a => Int]); $encode->({ a => 123 }); # => {"a":123} $encode->({ a => '123' }); # => {"a":123} Tuple[...]-
Subtype of
Tuple[A, B]encodes always to list of type A and B.my $encode = $jsont->encoder(Tuple[Int, Str]); $encode->([123, 456]); # => [123,"456"] ArrayRef[`a]-
Subtype of
ArrayRef[A]encodes always to list of all elements type A.my $encode = $jsont->encoder(ArrayRef[Bool]); $encode->([1,0,undef,!!0,\0]); # => [true,false,false,false,true] Maybe-
Maybeencodes to undef if value is undef.my $encode = $jsont->encoder(Maybe[Str]); $encode->('hello'); # => "hello" $encode->(undef); # => null Optional[`a]-
Dict[name => Str, id => Optional[Int]]allows{ name => "Bob" }but not{ name => "Bob", id => "BOB" }.my $encode = $jsont->encoder(Dict[a => Optional[Str]]); $encode->({a => 'foo'}); # => {"a":"foo"} $encode->({}); # => {}
More Example
use Types::Standard -types;
use JSON::TypeEncoder;
my $type = ArrayRef[
Dict[
name => Str,
fg => Bool,
foo => Optional[Str],
bar => Maybe[Num]
]
];
my $encode = JSON::TypeEncoder->new->encoder($type);
$encode->(
[
{ name => 'a', fg => !!1, foo => '1', bar => '10' },
{ name => 'b', fg => !!0, bar => '11' },
{ name => 'c', fg => !!1, foo => '2', bar => undef },
{ name => 'd', fg => !!0, bar => undef },
]
);
# =>
# [
# {"bar":10,"fg":true,"foo":"1","name":"a"},
# {"bar":11,"fg":false,"name":"b"},
# {"bar":null,"fg":true,"foo":"2","name":"c"},
# {"bar":null,"fg":false,"name":"d"}
# ]
SEE ALSO
LICENSE
Copyright (C) kfly8.
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
AUTHOR
kfly8 <kfly@cpan.org>
CONTRIBUTORS
- karupanerura