我在PostgreSQL系统上有一个返回布尔值的查询:
my $sth = $dbh->prepare("select 'f'::boolean");
$sth->execute;
my @vals = $sth->fetchrow_array;
当前的实施 PostgreSQL返回't'表示true和 'f'表示错误。从Perl的角度来看 看来,这是一个相当不幸的事 选择。因此DBD :: Pg进行翻译 一个BOOL数据类型的结果 Perlish方式:'f'成为数字 0和't'变为数字1.这 应用程序不必的方式 检查特定于数据库的返回 数据类型BOOL的值因为 Perl将0视为false,将1视为true。 您可以设置pg_bool_tf属性 改变价值的真正价值 如果你愿意,回到't'和'f'。
因此,只要pg_bool_tf返回0,该语句就应该返回0,这样做。但是,在JSON :: XS(和普通JSON)的某个地方将返回的0解释为字符串:
use JSON::XS qw(encode_json);
my $options =
{
layout => 0,
show_widget_help => $vals[0] // 1,
};
die encode_json($options);
......死于:
{ “布局”:0, “show_widget_help”: “0”}
...除了我的JavaScript在那里期望一个布尔值,并且非空字符串“0”被评估为true之外,这将是正常的。为什么后者0引用而前者不引用?
根据the JSON::XS docs,这是一个主要特征:
往返完整性
序列化perl数据时 仅使用数据类型的结构 由反序列化的JSON支持 数据结构相同 Perl级别。 (例如字符串“2.0” 不会突然变成“2” 因为它看起来像一个数字)。那里 未成年人是例外,请阅读 下面的MAPPING部分了解 那些。
...说:
简单的Perl标量(任何标量 不是参考)是最多的 难以编码的对象:JSON :: XS 将未定义的标量编码为JSON 空值,最后一个标量 之前在字符串上下文中使用过 编码为JSON字符串,以及任何东西 否则为数字值。
但我从不在字符串上下文中使用@vals [0]。也许DBD :: Pg在返回它之前在某处使用它的布尔值0作为字符串?
答案 0 :(得分:4)
JSON::XS
doc说明以下内容将转换为true
/ false
0
和1
,即。 \0
和\1
JSON::XS::true
和JSON::XS::false
使用其中一个可以解决您的问题