我在PostgreSQL系统上返回布尔值的查询:
my $sth = $dbh->prepare("select 'f'::boolean");
$sth->execute;
my @vals = $sth->fetchrow_array;
根据the DBD::Pg docs,
目前的执行情况
PostgreSQL为true和't'返回
'f'为假。从Perl的角度
看来,这是很不幸的
选择。因此DBD :: Pg会翻译
BOOL数据类型在
有效方式:“ f”成为数字
0和't'成为数字1。这
应用程序不必
检查特定于数据库的返回
数据类型BOOL的值,因为
Perl将0视为假,将1视为真。
您可以设置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);
...死于:
{“ layout”:0,“ show_widget_help”:“ 0”}
...那很好,除了我的JavaScript在那里期望布尔值,并且非空字符串“ 0”被评估为true。为什么后面的0被引用而前面的没有呢?
根据the JSON::XS docs,这是一个主要功能:
往返完整性
序列化Perl数据时
仅使用数据类型的结构
由JSON支持,反序列化
数据结构在
Perl级别。 (例如,字符串“ 2.0”
不会突然变成“ 2”
因为它看起来像一个数字)。那里
次要是例外,请阅读
下面的“映射”部分了解
那些。
...表示:
简单的Perl标量(任何
(不是参考)是最多的
难以编码的对象:JSON :: XS
将未定义的标量编码为JSON
空值,最后的标量
之前在字符串上下文中使用过
编码为JSON字符串等
否则作为数字值。
但是我从来没有在字符串上下文中使用@vals [0]。也许DBD :: Pg在返回它之前将其布尔值0用作字符串?
最佳答案
JSON::XS
文档说以下内容将转换为true
/ false
引用整数0
和1
,即。 \0
和\1
JSON::XS::true
和JSON::XS::false
使用其中之一应该可以解决您的问题