【问题标题】:Perl / DBI query doesn't preserve integer values for JSON outputPerl / DBI 查询不保留 JSON 输出的整数值
【发布时间】:2019-04-01 02:52:14
【问题描述】:

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

【问题讨论】:

标签: mysql json perl dbi hashref


【解决方案1】:

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} 中作为数组提供,但这很漂亮复杂且可能不可靠。

【讨论】:

  • 非常感谢。是否“手动”构建整个 JSON 输出实际上可能更有效,这看起来值得商榷。即$name =~ s/"/\"/g; my $json = qq~{"id":$id, "name":"$name", "age": $age}~;
  • 这不是一个好主意。 JSON 编码并不像您想象的那么简单,尤其是当您的名字中的一个最终包含非 ASCII 字符时。无论如何,Cpanel::JSON::XS 是可用的最快、最正确的 JSON 编码器之一。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-25
相关资源
最近更新 更多