shimxmemo

メモをのこすよ!

JSON::XS::Booleanのオブジェクトが返ってきた時の為の備忘録

JSON::XSで、取得したJSONをdecodeしてPerlのハッシュリファレンスにした場合、JSON::XS::Booleanのオブジェクトが入ってた時用のメモ。

 

例えば

{
  "flag_on"      : true,
  "flag_off"     : false
  "flag_on_str"  : "true",
  "flag_off_str" : "false"
}

というJSONをdecodeすると

 

use Data::Dumper;
use JSON::XS;

my $ref = decode_json $json_text;

warn Dumper $ref;
{
    'flag_on'      => bless( do{\(my $o = 1)}, 'JSON::XS::Boolean' ),
    'flag_off'     => bless( do{\(my $o = 0)}, 'JSON::XS::Boolean' ),
    'flag_on_str'  => 'true',
    'flag_off_str' => 'false',
}

という感じになる。

 

JSON::XS::Boolean?どうすりゃええねんとなるが、JSON::XS::Booleanオブジェクトだった場合はJSON::XS::trueやJSON::XS::falseと比較すればおk。

 

JSON::XS::Booleanオブジェクトかどうか判定するには、JSON::XSのis_bool関数を使えば良い。

 

上記例であえて書くと

foreach my $ref_key (keys %{$ref}) {
    my $is_boolean = JSON::XS::is_bool($ref->{$ref_key});

    if ($is_boolean) {
        # JSON::XS::Booleanオブジェクトだった場合
        if ( $ref->{$ref_key} == JSON::XS::true ) {
            &_true_process();
        }
        elsif ( $ref->{$ref_key} == JSON::XS::false ) {
            &_false_process();
        }
    }
    else {
        if ($ref->{$ref_key} eq 'true') {
            &_true_process();
        }
        elsif ($ref->{$ref_key} eq 'false') {
            &_false_process();
        }
    }
}

てな感じか。

 

ほんとか?