perl/dbi查询不为json输出保留整数值

juud5qan  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(477)

我无法让这个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}
u7up0aaq

u7up0aaq1#

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} ,但这相当复杂,可能不可靠。

相关问题