В кодировке Perl Json есть кавычки для float
perl version 5.18
У меня возникла проблема с JSON-кодировщиком perl и я помещаю кавычки вокруг плавающей запятой
см. пример кода:
use JSON;
use Data::Dumper;
my $float = 1.2;
my $t = {
float => $float
};
my $json1 = encode_json($t);
print Dumper $t;
my $json2 = encode_json($t);
print $json1 . "\n";
print $json2 . "\n";
Выход:
$VAR1 = {
'float' => '1.2',
'integer' => 1
};
{"float":1.2,"integer":1}
{"float":"1.2","integer":1}
Как вы можете видеть после использования Dumper, кодировщик JSON добавляет кавычки. Есть идеи, почему это произойдет?
Не в приведенном выше примере кода, но в производстве, я не могу удалить кавычки, если я не добавлю 0,01. Даже *= *1 не работает.
1 ответ
Это "ожидаемое" странное поведение, которое происходит (в старых версиях perl) из-за того, как perl обрабатывает переменные. Каждая переменная может иметь числовые и строковые представления, которые могут храниться в памяти одновременно. В большинстве случаев Perl будет использовать правильное представление в зависимости от контекста.
Когда вы назначаете $t
значение с плавающей запятой, сохраняется только числовое представление. Вот почему сначала encode_json
ведет себя как ожидалось. Затем сброс переменной создает строковое представление, которое также сохраняется в памяти. Не удаляет представление номера, но при втором вызове encode_json
не может сказать, какое представление использовать и принимает строку.
Еще раз Perl 5.18 уже 5 лет, и это поведение было исправлено в более новых версиях Perl, поэтому я предлагаю использовать последние версии.
См. https://www.perlmonks.org/?node_id=909619 для подробного обсуждения.