Запрос Perl / DBI не сохраняет целочисленные значения для вывода в формате JSON - PullRequest
0 голосов
/ 27 октября 2018

Я не могу заставить этот код Perl возвращать истинные целочисленные значения для целых чисел в таблице.Столбцы таблицы MySQL правильно указаны как целые числа, однако вывод JSON здесь заключает все значения запроса в кавычки.Как я могу правильно сохранить типы данных (особенно целые и логические значения), как указано?

use strict;
use warnings;
use DBI;
use JSON;

my $sth = "SELECT id, name, age FROM table";

my $data = $dbh->selectall_arrayref($sth, {Slice => {}});

my $response = encode_json($data);
print $response;

## outputs: {"id":"1","name":"Joe Blodge","age":"42"}

Что я здесь не так делаю?Как я могу получить это, чтобы вывести правильно отформатированный JSON:

{"id":1,"name":"Joe Blodge","age":42}

1 Ответ

0 голосов
/ 27 октября 2018

DBD :: mysql возвращает все результаты в виде строк (см. https://github.com/perl5-dbi/DBD-mysql/issues/253). Обычно Perl не заботится, когда это имеет значение, кодирование в JSON является одним из немногих случаев. Вы можете использовать Cpanel ::JSON :: XS :: Type для предоставления объявлений типов для вашей структуры JSON:

use Cpanel::JSON::XS;
use Cpanel::JSON::XS::Type;

my $response = encode_json($data, {id => JSON_TYPE_INT, name => JSON_TYPE_STRING, age => JSON_TYPE_INT});

или вы можете пройти и пронумеровать соответствующие элементы перед кодировкой JSON.

$data->{$_} += 0 for qw(id age);

Можно проверить тип (как указано в MySQL) каждого возвращаемого столбца. Если вы создадите и выполните свой запрос, используя дескриптор оператора, тогда тип будет доступен в виде массива в $sth->{TYPE}, но это довольно сложно иможет быть ненадежным.

...