从Perl中的Moose对象的JSON输出中删除__CLASS__

时间:2013-08-28 18:39:12

标签: json perl serialization moose

我正在使用perl中的moose对象。我希望能够将我直接制作的驼鹿对象转换为JSON。

但是,当我使用MooseX :: Storage来隐藏对象时,它包含一个隐藏的属性,我不知道如何删除“__CLASS__”。

有没有办法使用MooseX :: Storage删除它? (现在我只是使用MooseX :: Storage来转换它并使用JSON通过转到哈希来删除“__ CLASS __”属性。)我现在正在做的解决方案是一个问题,因为我必须这样做每次我为每个对象获取JSON(所以当我将JSON输出写入文件时,要加载我必须每次都进行更改,并且还必须处理任何referanced对象)

package Example::Component;
use Moose;
use MooseX::Storage;
   with Storage('format' => 'JSON');

   has 'description' => (is => 'rw', isa => 'Str');

1;
no Moose;
no MooseX::Storage;
use JSON;

my $componentObject = Example::Component->new;
$componentObject->description('Testing item with type');
my $jsonString = $componentObject->freeze();
print $jsonString."\n\n";

my $json_obj = new JSON;

my $perl_hash = $json_obj->decode ($jsonString);
delete ${$perl_hash}{'__CLASS__'};
$jsonString = $json_obj->encode($perl_hash);
print $jsonString."\n\n";

1 个答案:

答案 0 :(得分:1)

MooseX::Storage并不特别适合这项任务。它旨在启用Moose对象的持久存储(这就是它添加__CLASS__字段的原因),以便稍后程序可以检索它们。

如果您的目标是为JSON API构建对象,那么将对象的hashref直接传递给JSON.pm可能要容易得多。

use JSON -convert_blessed_universally;

my $json_obj = JSON->new->allow_blessed->convert_blessed;
my $jsonString = $json_obj->encode( $componentObject );

-convert_blessed_universally选项(除了满口之外)将导致JSON.pm将有福的引用(对象)视为普通的Perl结构,可以直接转换为JSON。

编辑:看起来您还必须将allow_blessedconvert_blessed选项添加到JSON对象。