2017-11-02 6 views
2

への変換を提供するためのムースタイプを決定します。私は、MyClassのをインスタンス化し、json_encoderに新しいオブジェクトを渡すときはMyClassの、私はクラスを持っているJSON

package MyClass; 
use Moose; 

has 'IntegerMember' => (
    is => 'rw', 
    isa => 'Int' 
); 

has 'BooleanMember' => (
    is => 'rw', 
    isa => 'Bool' 
); 

sub TO_JSON { 
    my $self = shift; 
    return { % { $self } }; 
} 

は現在、私は予想通りJSON文字列が返され得ます。

use JSON; 
use MyClass; 

my $object_to_encode = MyClass->new ( 
    IntegerMember => 10, 
    BooleanMember => 1 
); 
my $json_encoder = JSON->new->convert_blessed; 
my $json_data = $json_encoder->encode($object_to_encode); 

MyClassので、私は私のto_jsonをサブルーチンを改善したい:私はPerlのブール値(1,0)(真、偽)に変換されるだろうが、それはJSONモジュールを設計する方法がないことを期待していました(1または0)から(trueまたはfalse)に任意のムース「ブール」メンバの変換を提供します。私は、MyClassのメンバーを反復ので、私が提供できるように私はムースタイプを決定することができますどのように

sub TO_JSON { 
    my $self = shift; 
    for my $member (%$self) { 
     if { 
      # Convert '1' to 'true' if Moose Type is 'Bool' 
     } else { 
      # Keep the member as is 
     } 
    } 
} 

変換の仕組みですか?

+1

JSONモジュールは、\ 'スカラーリファレンスとして_真_と_false_を表し、 '1'と '\ 0'。しかし、 '1'か' 2'がブール値かどうかはわかりません。 – simbabque

+1

'$ json_encoder-> encode'を呼び出す必要があります。それはオブジェクトです。 – simbabque

+1

また、これはMooseの_isa_とは異なります。 Perl(またはMoose)には型がないので、_type_はそれほど気にしません。 _isa_に入れたものは、属性に入れた実行時チェックのためにのみ使用されます。 – simbabque

答えて

5

は、ここでそれを行うための一つの方法です:

package MyClass; 
use Moose; 

has 'IntegerMember' => (
    is => 'rw', 
    isa => 'Int' 
); 

has 'BooleanMember' => (
    is => 'rw', 
    isa => 'Bool' 
); 

sub TO_JSON { 
    my $self = shift; 
    my $meta = $self->meta; 
    my $result = {}; 
    for my $attr ($meta->get_all_attributes) { 
     my $name = $attr->name; 
     my $value = $attr->get_value($self); 
     my $type = $attr->type_constraint; 
     if ($type && $type->equals('Bool')) { 
      $value = $value ? \1 : \ 0; 
     } 
     $result->{$name} = $value; 
    } 
    return $result; 
} 

1 

私たちは、クラスをイントロスペクトし、(meta-attribute objectsの形で)すべての属性のリストを取得するためにmetaclass object->meta経由でアクセス可能)を使用します。

各属性について、名前、現在の値、およびtype constraint(存在する場合)が取得されます。タイプがBoolの場合、値を\1または\0に変換します。 JSONモジュールはこれらの値を理解し、trueまたはfalseに変換します。

そして、テストプログラム:

use strict; 
use warnings; 
use JSON::MaybeXS; 
use MyClass; 

my $object_to_encode = MyClass->new ( 
    IntegerMember => 10, 
    BooleanMember => 1 
); 
my $json_encoder = JSON->new->convert_blessed; 
my $json_data = $json_encoder->encode($object_to_encode); 

print "Result: $json_data\n"; 

出力:

Result: {"IntegerMember":10,"BooleanMember":true} 
関連する問題