Передача BigFloat между клиентом и сервером с использованием JSON в Perl

#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;