2012/09/04

JSON::Types::boolとJSON::PP::value_to_json

JSON::Types ってのを書いた

JSONとして数値を返したい時によく+0とかしてたけど,こっちの方が意図が明確になって良さそう.

JSON::Typesの実装方法を確認しているときに,JSON::Types::boolが気になった

    sub bool($) {
            $_[0] ? \1 : \0;
    }

なぜ1,0のreferenceを返してるのか.その答えはJSON::PP::value_to_jsonの中にあった.

    sub value_to_json {
        my ($self, $value) = @_;

        # 省略

        my $type = ref($value);

        if(!$type){
            return string_to_json($self, $value);
        }
        elsif( blessed($value) and  $value->isa('JSON::PP::Boolean') ){
            return $$value == 1 ? 'true' : 'false';
        }
        elsif ($type) {
            if ((overload::StrVal($value) =~ /=(\w+)/)[0]) {
                return $self->value_to_json("$value");
            }

            if ($type eq 'SCALAR' and defined $$value) {
                return   $$value eq '1' ? 'true'
                       : $$value eq '0' ? 'false'
                       : $self->{PROPS}->[ P_ALLOW_UNKNOWN ] ? 'null'
                       : encode_error("cannot encode reference to scalar");
            }

            # 省略
        }
        else {
            # 省略
        }

    }

JSON::PP::Boolean\1, \0を渡すとtrue, falseにしてくれる模様.

ちなみにJSON::PP::Booleanの生成方法

    $JSON::PP::true  = do { bless \(my $dummy = 1), "JSON::PP::Boolean" };
    $JSON::PP::false = do { bless \(my $dummy = 0), "JSON::PP::Boolean" };

0 件のコメント:

コメントを投稿