如何在Perl中正确解码包含Perl原生布尔值的JSON响应?
如何在Perl中正确解码包含Perl原生布尔值的JSON响应?
别担心,你遇到的这个情况其实是Perl的JSON模块处理JSON布尔值的正常表现,不是解码失败哦!
JSON里的true和false在Perl中没有对应的原生布尔类型(Perl用1和0或者空值来表示真假),所以JSON模块(比如JSON::PP或者JSON::XS)会把它们封装成JSON::PP::Boolean对象。你看到的bless( do{(my $o = 0)}, 'JSON::PP::Boolean' )只是Data::Dumper输出的对象形式,实际在代码里用的时候,这个对象在布尔上下文里是完全正常的——比如你直接写:
if ($data->{items}[0]{isCorrection}) { # 这里会正确识别真假逻辑 }
完全没问题。但如果就是想把它转成Perl原生的1/0或者真/假值,有几种简单方法:
手动转换:用三元表达式或者双感叹号快速转成原生值:
# 转成1或0的数值形式 my $is_correction = $data->{items}[0]{isCorrection} ? 1 : 0; # 转成Perl的原生布尔值(双感叹号强制触发布尔上下文) my $is_correction_bool = !!$data->{items}[0]{isCorrection};解码时直接配置JSON模块:如果用JSON::XS或者JSON::PP,可以在解码前设置参数,让JSON布尔值直接转成Perl的
1和0:use JSON::XS; my $json_parser = JSON::XS->new->boolean_values(1, 0); my $data = $json_parser->decode($your_json_string); # 此时isCorrection就是1或0,不再是封装对象要是用的是核心的JSON模块,也可以这样传参数:
use JSON; my $data = decode_json($your_json_string, { boolean_values => [1, 0] });
总结一下:那个JSON::PP::Boolean对象本身不影响逻辑使用,只是输出看起来奇怪;如果追求更“原生”的Perl值,用上面的方法转换就行~
备注:内容来源于stack exchange,提问作者AR17
相关产品推荐
相关产品推荐

