4

我们最近切换到新的 JSON2 perl 模块。我以为现在所有的东西都被引用了。但是我遇到了一些情况,其中一个数字 ( 250) 在 perl 创建的 json 字符串中作为不带引号的数字返回。

出于好奇: 有谁知道为什么存在这种情况以及 json 模块如何决定是否引用一个值?

4

2 回答 2

8

如果是数字,它将不被引用。在不深入 Perl 内部的情况下,如果它是一个字面数字或算术运算的结果,那么它就是一个数字,并且自从它的数值产生以来它还没有被字符串化

use JSON::XS;
my $json = JSON::XS->new->allow_nonref;

say $json->encode(42);   # 42
say $json->encode("42"); # "42"

my $x = 4;
say $json->encode($x); # 4
my $y = "There are $x lights!";
say $json->encode($x); # "4"
$x++; # modifies the numeric value of $x
say $json->encode($x); # 5

请注意,打印数字并不是“将其字符串化”,即使它会生成要输出的数字的字符串表示形式;print $x不会导致数字成为字符串,但print "$x"会。

无论如何,所有这一切都有点奇怪,但是如果您希望在 JSON 中可靠地不引用一个值,那么0 + $value在对其进行编码之前立即将其放入您的结构中,如果您希望它被可靠地引用然后使用"" . $valueor "$value"

于 2013-06-12T15:10:39.330 回答
1

您可以通过执行以下操作将其强制为字符串:

$number_str = '' . $number;

例如:

perl -MJSON -le 'print encode_json({foo=>123, bar=>"".123})'
{"bar":"123","foo":123}

看起来旧版本的 JSON 具有可以设置的自动转换功能。您没有$JSON::AUTOCONVERT设置为真实值吗?

于 2013-06-12T15:07:37.597 回答