#json #perl #floating-point
#json #perl #с плавающей запятой
Вопрос:
Я передаю денежные значения между клиентом и сервером и использую Math::BigFloat
(в Perl) для поддержания точности значений. Моя проблема в том, что при обмене данными между клиентом и сервером я использую JSON
и получаю сообщение об ошибке при использовании from_json
to_json
ярлыков и в Perl.
Ошибка говорит, что я не включил ни allow_blessed, ни convert_blessed. Есть ли способ включить их, продолжая использовать ярлыки from_json и to_json, и не использовать интерфейс OO ( $json = JSON->new->allow_nonref;
)
В более общем плане, каков правильный способ обработки JSON-связи между сервером и клиентом с числовыми типами высокой точности?
Ответ №1:
Вероятно, проще всего упорядочить число, а затем превратить его обратно в Math::BigFloat на другой стороне.
Например:
package Client;
use strict;
use warnings;
use Math::BigFloat;
use JSON qw(to_json);
my $pi = Math::BigFloat->bpi(1000);
my $json = to_json { pi => $pi->bstr };
say $json;
И затем:
package Server;
use strict;
use warnings;
use Math::BigFloat;
use JSON qw(from_json);
my $json = '{ "pi":"3.14159" }';
my $hashref = from_json($json);
my $pi = Math::BigFloat->new($hashref->{pi});
say $pi;