我们最近切换到新的 JSON2 perl 模块。我以为现在所有的东西都被引用了。但是我遇到了一些情况,其中一个数字 ( 250
) 在 perl 创建的 json 字符串中作为不带引号的数字返回。
出于好奇: 有谁知道为什么存在这种情况以及 json 模块如何决定是否引用一个值?
如果是数字,它将不被引用。在不深入 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
or "$value"
。
您可以通过执行以下操作将其强制为字符串:
$number_str = '' . $number;
例如:
perl -MJSON -le 'print encode_json({foo=>123, bar=>"".123})'
{"bar":"123","foo":123}
看起来旧版本的 JSON 具有可以设置的自动转换功能。您没有$JSON::AUTOCONVERT
设置为真实值吗?