our
@EXPORT
=
qw()
;
our
@EXPORT_OK
=
qw(to_json)
;
our
%EXPORT_TAGS
= (
all
=> [
@EXPORT
,
@EXPORT_OK
]);
sub
fieldname_to_json(
$str
) {
'"'
.
$str
.
'"'
}
sub
fieldname_to_mint(
$str
) {
my
$s
=
lcfirst
(
$str
);
$s
=~ s/^\s+//;
$s
=~ s/\s+\z//;
$s
=~ s/[^\w\d_]/_/sg;
if
(
$s
=~ m/^\d/) {
$s
=
"_$s"
;
}
$s
}
TEST { fieldname_to_mint
"Quadrat 'o'Hara"
}
'quadrat__o_Hara'
;
our
$output_formats
= {
JSON
=>
{
hashmap_pair_op
=>
": "
,
fieldname_convert
=> \
&fieldname_to_json
, },
Mint
=>
{
hashmap_pair_op
=>
" = "
,
fieldname_convert
=> \
&fieldname_to_mint
, },
};
my
$json
= JSON->new->allow_nonref;
sub
scalar_to_json (
$val
,
$settings
) {
if
(
$settings
->{auto_numbers} and looks_like_number
$val
) {
$val
=~ s/\.0*\z//
if
$settings
->{auto_integers};
$val
}
else
{
$json
->encode(
$val
)
}
}
TEST {
my
$s
= {
auto_numbers
=> 0,
auto_integers
=> 0 };
scalar_to_json
"152.00"
,
$s
}
"\"152.00\""
;
TEST {
my
$s
= {
auto_numbers
=> 1,
auto_integers
=> 0 };
scalar_to_json
"152.00"
,
$s
}
"152.00"
;
TEST {
my
$s
= {
auto_numbers
=> 1,
auto_integers
=> 1 };
scalar_to_json
"152.00"
,
$s
}
"152"
;
TEST { scalar_to_json
"foo bar"
, {} }
"\"foo bar\""
;
sub
hashmap_to_json (
$hashmap
,
$settings
) {
my
$output_format
=
$output_formats
->{
$settings
->{output_format} };
my
$fieldname_convert
=
$output_format
->{fieldname_convert};
my
$hashmap_pair_op
=
$output_format
->{hashmap_pair_op};
"{\n"
. purearray(
sort
keys
%$hashmap
)->
map
(
sub
(
$title
) {
my
$value
=
$hashmap
->{
$title
};
$fieldname_convert
->(
$title
)
.
$hashmap_pair_op
. _to_json(
$value
,
$settings
)
}
)->strings_join(
",\n"
)
.
"\n}"
}
sub
sequence_to_json (
$l
,
$settings
) {
"[\n"
.
$l
->
map
(
sub
(
$v
) { _to_json(
$v
,
$settings
) })->strings_join(
",\n"
)
.
"\n]"
}
sub
_to_json (
$value
,
$settings
) {
if
(
defined
(
my
$class
= blessed
$value
)) {
if
(
$value
->isa(
"FP::Abstract::Sequence"
)) {
return
sequence_to_json(
$value
->purearray,
$settings
)
}
else
{
if
(
defined
(
my
$c
=
$settings
->{converter})) {
return
_to_json(
$c
->(
$value
),
$settings
)
}
else
{
die
"to_json: don't know how to map this: "
. show(
$value
)
}
}
}
elsif
(
my
$r
=
ref
(
$value
)) {
if
(
$r
eq
"ARRAY"
) {
return
sequence_to_json(array_to_purearray(
$value
),
$settings
)
}
elsif
(
$r
eq
"HASH"
) {
return
hashmap_to_json(
$value
,
$settings
)
}
}
else
{
return
scalar_to_json(
$value
,
$settings
)
}
die
"bug"
}
sub
to_json (
$value
,
$settings
) {
if
(
$settings
->{pretty}) {
my
$json
= JSON->new->allow_nonref->pretty->canonical;
$json
->encode(
$json
->decode(_to_json(
$value
,
$settings
)))
}
else
{
_to_json(
$value
,
$settings
)
}
}
1