You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 12:37:59