2017-11-02 23 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 문자열이 반환받을. 나는 펄 부울 (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의 형태로) 모든 속성의 목록을 얻을 :

+1

JSON 모듈은 스칼라 참조'로 _true_ 및 _false_을 나타내는 \ 1 '와'\ 0'. 그러나 '1'또는 '2'가 부울인지 여부는 알 수 없습니다. – simbabque

+1

'$ json_encoder-> encode'를 호출해야합니다. 그것은 하나의 대상입니다. – simbabque

+1

또한 Moose의 _isa_와는 다릅니다. Perl (또는 Moose)에 유형이 없기 때문에 _type_에 대해서는별로 신경 쓰지 않습니다. _isa_에 두는 것은 속성에 넣는 일들을 런타임에서 확인하는 용도로만 사용됩니다. – simbabque

답변

5

여기에 그것을 할 수있는 한 가지 방법입니다.

각 속성에 대해 이름, 현재 값 및 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}