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(); } } }
てな感じか。
ほんとか?