【发布时间】:2017-11-02 14:09:31
【问题描述】:
我有一个班级,MyClass:
package MyClass;
use Moose;
has 'IntegerMember' => (
is => 'rw',
isa => 'Int'
);
has 'BooleanMember' => (
is => 'rw',
isa => 'Bool'
);
sub TO_JSON {
my $self = shift;
return { % { $self } };
}
目前,当我实例化 MyClass 并将新对象传递给 json_encoder 时,我得到了一个按预期返回的 JSON 字符串。我希望将 perl 布尔值( 1,0 )转换为( true, false ),但这不是 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 子例程,以提供任何 Moose 'Bool' 成员从(1 或 0)到(true 或 false)的转换:
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 的成员时,如何确定 Moose 类型,以便为转换提供机制?
【问题讨论】:
-
JSON 模块将 true 和 false 表示为标量引用
\1和\0。但它不知道1或2是布尔值。 -
您需要致电
$json_encoder->encode。这是一个对象。 -
另外,这不是 Moose 中的 isa 所做的。它并不真正关心 type 本身,因为 Perl(或 Moose)中没有类型。您放入 isa 的内容仅用于运行时检查您放入属性的内容。
-
而且你不应该直接干预底层
$self的内部结构。事实上,您的for循环只会迭代一次,因为$self是一个哈希引用。所以你有一个元素的列表。该元素是$self。它将分配给$member,然后您就完成了。但也有语法错误,因为for块不能有else块。我认为您需要重新考虑您要完成的工作。 -
谢谢辛巴克。我已经更正了你提到的我忽略的语法错误。
标签: json perl introspection moose