为什么JSON模块会引用一些数字而不引用其他数字?

时间:2013-06-12 14:59:06

标签: json perl

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

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

2 个答案:

答案 0 :(得分: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放入你的结构中,如果你想要它可靠地引用那么使用"" . $value"$value"

答案 1 :(得分:1)

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

$number_str = '' . $number;

例如:

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

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