为什么我不能通过Perl通过JSON :: XS从PostgreSQL中正确编码布尔值?

时间:2009-07-06 14:32:48

标签: perl json dbi

我在PostgreSQL系统上有一个返回布尔值的查询:

my $sth = $dbh->prepare("select 'f'::boolean");
$sth->execute;
my @vals = $sth->fetchrow_array;

根据the DBD::Pg docs

  

当前的实施   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作为字符串?

1 个答案:

答案 0 :(得分:4)

JSON::XS doc说明以下内容将转换为true / false

  • 引用整数01,即。 \0\1
  • JSON::XS::trueJSON::XS::false

使用其中一个可以解决您的问题