如何使perl数字常量在序列化为json时始终为数字

问题描述 投票:0回答:1

这是按我预期工作的代码:

#!/usr/bin/perl

use strict;
use warnings FATAL => 'all';
use feature qw(say);

use constant MY_CONSTANT => 42;

use JSON::XS;

say encode_json { value => MY_CONSTANT };

此代码输出:

{"value":42}

但是如果常量用于字符串连接,然后在 json 中设置一个数字,我会得到字符串:

#!/usr/bin/perl

use strict;
use warnings FATAL => 'all';
use feature qw(say);

use constant MY_CONSTANT => 42;

use JSON::XS;

say encode_json { value => MY_CONSTANT };

my $smth = 'asdf' . MY_CONSTANT;

这是输出:

{"value":"42"}

对我来说,“常量”根据它的使用方式改变它的行为是非常出乎意料的。

有没有办法在perl中定义一个带有数字的常量,即使在串联中使用,该常量也会转换为json中的数字值。

perl
1个回答
0
投票

理想情况下,无论您使用

"42"
还是
42
初始化变量,Perl 都会将四十二视为四十二。 JSON::XS 破坏了该模型,这会导致与您看到的结果类似的结果。

您可以使用 sub 而不是常量。

sub MY_CONSTANT() { return 42 }

这样,它每次都会返回一个新的标量。

return
很重要,因为它阻止将 sub 转换为常量。

但更好的解决方案可能是切换到 Cpanel::JSON::XS 并使用 Cpanel::JSON::XS::Type 告诉编码器如何序列化字段。

© www.soinside.com 2019 - 2024. All rights reserved.