로 변환을 제공하는 무스 타입을 결정 : 나는 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 문자열이 반환받을. 나는 펄 부울 (1,0)을 (참, 거짓)로 변환 될 것이라고 기대했다하지만이 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 서브 루틴을 향상시키고 자
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
}
}
}
내가 제공 할 수 있도록 내가 MyClass의 '회원을 반복 나는이 무스 타입를 확인할 수 있습니다 방법 : 어떠한 무스'BOOL '멤버의 전환 (1 또는 0) (true 또는 false)에 제공 변환 메커니즘?
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
를 통해 접근)을
metaclass object를 사용하는 클래스를 인트로 (
meta-attribute objects의 형태로) 모든 속성의 목록을 얻을 :
JSON 모듈은 스칼라 참조'로 _true_ 및 _false_을 나타내는 \ 1 '와'\ 0'. 그러나 '1'또는 '2'가 부울인지 여부는 알 수 없습니다. – simbabque
'$ json_encoder-> encode'를 호출해야합니다. 그것은 하나의 대상입니다. – simbabque
또한 Moose의 _isa_와는 다릅니다. Perl (또는 Moose)에 유형이 없기 때문에 _type_에 대해서는별로 신경 쓰지 않습니다. _isa_에 두는 것은 속성에 넣는 일들을 런타임에서 확인하는 용도로만 사용됩니다. – simbabque