说我有以下输入的JSON对象
{
"field1": 21,
"field2": "21",
"field3": "hello"
}
有没有办法用decode_json或from_json知道值的原始类型(数字与字符串)是什么?我知道Perl一般不关心类型,但我需要知道原始类型是什么。我也知道perl在创建JSON对象时会跟踪类型(所以它在创建JSON对象时确实区分了" 21"和21,所以我希望有一种方法可以在保存时保留这些信息解码/'来自它。
我不想把它建立在字段名称的基础上,因为我试图编写一些会在某种程度上使用的东西,并且字段名称可能会改变。
答案 0 :(得分:4)
使用JSON :: XS时,标量中值的类型与文档中值的类型相匹配。
$ perl -e'
use strict;
use warnings;
use B qw( svref_2object SVf_IOK SVf_NOK SVf_POK );
use JSON::XS qw( decode_json );
my $data = decode_json(q{[ "4", 4, 4.0, 20000000000000000000 ]});
for my $i (0..$#$data) {
my $sv = svref_2object(\( $data->[$i] ));
my $flags = $sv->FLAGS;
printf("Scalar %s has %s\n",
$i,
join(",",
$flags & SVf_POK ? "PV" : (),
$flags & SVf_IOK ? "IV" : (),
$flags & SVf_NOK ? "NV" : (),
),
);
}
'
Scalar 0 has PV
Scalar 1 has IV
Scalar 2 has NV
Scalar 3 has PV
如您所见,使用JSON :: XS时,第四个标量是一个例外。 JSON :: XS将非常大的数字存储为字符串,以避免失去精度。
使用JSON :: PP获得类似的结果:
Scalar 0 has PV
Scalar 1 has IV
Scalar 2 has NV
Scalar 3 has NV