В кодировке 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 для подробного обсуждения.

Другие вопросы по тегам