我们最近切换到了新的JSON2 perl模块。
我认为现在所有的一切都被引用了。
但我遇到了一些情况,其中一个数字(250
)作为由perl创建的json字符串中的未引用数字返回。
出于好奇: 有谁知道为什么会出现这种情况以及json模块如何决定是否引用某个值?
答案 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
设置为真值吗?