我在PostgreSQL系统上返回布尔值的查询:
my $sth = $dbh->prepare("select 'f'::boolean");
$sth->execute;
my @vals = $sth->fetchrow_array;
Run Code Online (Sandbox Code Playgroud)
根据DBD :: Pg文档,
PostgreSQL的当前实现返回“ t”为真,“ f”为假。从Perl的角度来看,这是一个非常不幸的选择。因此,DBD :: Pg以Perlish方式转换BOOL数据类型的结果:'f'变为数字0,'t'变为数字1。这样,应用程序不必检查特定于数据库的返回值数据类型为BOOL,因为Perl将0视为false,将1视为true。您可以根据需要将pg_bool_tf属性设置为true值,以将值更改回'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);
Run Code Online (Sandbox Code Playgroud)
...死于:
{“ layout”:0,“ show_widget_help”:“ 0”}
...那很好,除了我的JavaScript在那里期望布尔值,并且非空字符串“ 0”被评估为true。为什么后一个引用0,而前一个引用不呢?
根据JSON :: XS docs,这是一个主要功能:
往返完整性
当仅使用JSON支持的数据类型序列化perl数据结构时,反序列化的数据结构在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
使用其中之一应该可以解决您的问题