perl version 5.18
我在perl JSON编码器上遇到问题,并在浮点数周围加上引号。
请参阅示例代码:
use JSON;
use Data::Dumper;
my $float = 1.2;
my $t = {
float => $float
};
my $json1 = encode_json($t);
print Dumper $t;
my $json2 = encode_json($t);
print $json1 . "\n";
print $json2 . "\n";
输出:
$VAR1 = {
'float' => '1.2',
'integer' => 1
};
{"float":1.2,"integer":1}
{"float":"1.2","integer":1}
您可以在使用Dumper之后看到JSON编码器添加了引号。任何想法为什么会发生这种情况?
不在上面的示例代码中,但是在生产中,除非添加.01,否则无法删除引号。甚至* = * 1也不起作用。
答案 0 :(得分:5)
这是一个“预期的”奇怪行为,由于perl处理变量的方式而发生(在旧版本的perl中)。每个变量可以具有数字和字符串表示形式,可以同时存储在内存中。在大多数情况下,perl会根据上下文使用适当的表示形式。
为$t
分配浮点值时,仅存储数字表示形式。这就是为什么第一个encode_json
表现出预期的原因。然后转储变量将创建字符串表示形式,该字符串表示形式也将存储在内存中。它不会删除数字表示形式,但是在第二个调用encode_json
中无法确定要使用哪种表示形式并采用字符串。
再一次,perl 5.18已有5年历史了,这种现象已在perl的较新版本中得到修复,因此我的建议是使用最新版本。
有关详细讨论,请参见https://www.perlmonks.org/?node_id=909619。