JSON::TypeEncoder - serialize JSON using type information
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}
JSON::TypeEncoder serialize Perl data structures to JSON using type information. This module goal is to be correct and fast.
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.
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% --
This module is written by pure Perl. So you can easily install it.
This module NOT supports decode JSON to Perl data structures. You should use other modules like JSON::XS to decode.
Types::Standard is used for type specification. The basic types are as follows, you can specify the type of JSON by this combination.
-
Str
Subtype of
Str
encodes always to string.my $encode = $jsont->encoder(Str); $encode->(123) # => "123"
-
Num
Subtype of
Num
encodes always to number.my $encode = $jsont->encoder(Num); $encode->(123) # => 123
-
Bool
Subtype of
Bool
encodes 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
Maybe
encodes 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->({}); # => {}
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"}
# ]
Copyright (C) kfly8.
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
kfly8 kfly@cpan.org
- karupanerura