我无法获得此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}
答案 0 :(得分:3)
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}
中作为数组使用,但这非常复杂,可能并不可靠。