Perl Json编码有浮点引号

cli*_*nm9 3 perl json data-dumper

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";
Run Code Online (Sandbox Code Playgroud)

输出:

$VAR1 = {
          'float' => '1.2',
          'integer' => 1
        };
{"float":1.2,"integer":1}
{"float":"1.2","integer":1}
Run Code Online (Sandbox Code Playgroud)

正如您在使用Dumper后看到的那样,JSON编码器会添加引号.有什么想法会发生这种情况吗?

不在上面的示例代码中,但在生产中,除非我添加.01,否则我无法删除引号.即使*=*1也不起作用.

Ser*_*nov 5

由于perl处理变量的方式,这是一种"预期的"奇怪行为(在旧版本的perl中).每个变量可以具有数字和字符串表示,其可以同时存储在存储器中.在大多数情况下,perl将根据上下文使用适当的表示.

分配$t浮点值时,仅存储数字表示.这就是首先encode_json表现如预期的原因.然后转储变量创建字符串表示,该表示也存储在内存中.它不会删除数字表示,但在第二次调用encode_json时无法分辨使用哪个表示并采用字符串.

perl 5.18现在已经5年了,这个行为在perl的新版本中得到了修复,所以我的建议是使用最新版本.

有关详细讨论,请参阅https://www.perlmonks.org/?node_id=909619.