最近、新しい 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
真の値を設定していませんか?