【问题标题】:Remove __CLASS__ From JSON Output of Moose Object In Perl从 Perl 中 Moose 对象的 JSON 输出中删除 __CLASS__
【发布时间】:2013-08-31 23:46:09
【问题描述】:

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

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

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

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";

【问题讨论】:

  • 这不是给你正在存储的对象的类名吗?你为什么要摆脱它?你到底想完成什么,在这里?
  • 我正在尝试使用 JSON API,“CLASS”对于我正在使用的 api 无效,并且 API 不会采用 JSON 对象跨度>

标签: json perl serialization moose


【解决方案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 将祝福引用(对象)视为可以直接转换为 JSON 的普通 Perl 结构。

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

【讨论】:

  • 这有一个小问题,我希望能够将项目推回驼鹿对象中,这可以用 $json_obj->decode 吗?
  • 当然可以,但是您需要直接使用构造函数,因为 JSON 数据不保留任何类关联。所以像Example::Component->new( %{ $json_obj->decode } )
猜你喜欢
  • 2011-02-18
  • 2012-08-28
  • 2018-07-30
  • 2017-03-25
  • 1970-01-01
  • 2019-02-26
  • 1970-01-01
  • 1970-01-01
  • 2014-09-06
相关资源
最近更新 更多