当前位置: 首页 > 面试题库 >

如何将Perl对象转换为JSON,反之亦然

狄峰
2023-03-14
问题内容

我在文件中定义了一个Point对象,Point.pm如下所示:

package Point;
sub new {
    my ($class) = @_;
    my $self = {
        _x => 0,
        _y => 0,
    };
    return bless $self => $class;
}

sub X {
    my ($self, $x) = @_;
    $self->{_x} = $x if defined $x;
    return $self->{_x};
}

sub Y {
    my ($self, $y) = @_;
    $self->{_y} = $y if defined $y;
    return $self->{_y};
}

1;

现在,当我使用JSON通过以下代码将对象转换为JSON时:

use JSON;
use Point;

Point $p = new Point;
$p->X(20);
$p->Y(30);

my $json = encode_json $p;

我收到以下错误:

encountered object 'Point=HASH(0x40017288)', but neither allow_blessed nor convert_blessed settings are enabled at test.pl line 28

如何使用JSON模块在JSON与对象之间进行转换?


问题答案:

警告会告诉您大部分错误。除非您告诉 JSON 如何处理 祝福的
引用(Perl对象),否则 JSON 仅处理非祝福的数据结构

你可以convert_blessed,你可以allow_blessed。对于allow_blessed,它说:

如果$enable为false(默认值),则编码在遇到受祝福的对象时将引发异常。

Point 是一个对象类,因此的一个实例Point是一个有福的引用,因此for的默认设置JSON是引发异常。

如果启用convert_blessed,它将TO_JSON在您的对象上调用一个方法。使用
简单的 对象Point(不包含受祝福成员的对象),您可以像执行以下操作一样轻松:

sub TO_JSON { return { %{ shift() } }; }

如果你有一个下降的结构,它会得到 很多的 多毛。

以下评论中的某人说,我没有介绍如何 JSON中获取对象。

基础很简单。所以这里去

my $object = bless( JSON->new->decode( $json_string ), 'ClassIWant' );

我主要介绍了 阻止 您简单地将受祝福的对象序列化为JSON的部分。

反序列化的基础很简单,就像序列化的基础很简单一样-一旦知道了窍门。方式上没有错误,只有找到所需内容并将其祝福给正确的班级的任务。

如果您想将代码耦合到对象,那么您将知道必须祝福的内容以及必须祝福的内容。如果您想要完全解耦的代码,那么
在Perl中这比在JavaScript本身中更难或更容易

您将必须在JSON中序列化 标记
。如果我需要这样的东西,我会'__CLASS__'在祝福对象中插入一个字段。反序列化时,我将遍历结构并为所有类似的事情祝福:

 bless( $ref, delete $ref->{__CLASS__} );

但是正如我所说,在Perl中这并不容易,也很难,因为JSON对所有语言都提出了相同的挑战。

正如Schwern在顶部的评论中所建议的那样,YAML更好地用于序列化和反序列化对象,因为它具有 注释 。JSON为您提供了一个或多个关联数组。



 类似资料:
  • 问题内容: 我正在使用JAXB将json转换为java对象。我面临的问题是,它导致我创建了大量的类,这些类除了充当json标签的占位符外没有其他用途。 例如:在json下面考虑: } 现在要将这个JSON原样反序列化为java对象,这些是我需要创建的java类: 因此,总共有9个类可以模仿JSON,并且如果我们研究这些类的角色,它们不过是JSON标签的占位符。有什么简单的方法吗? 问题答案: 您可

  • 问题内容: 我正在搜索轻量级API(最好是单个类)以转换 到xml,反之亦然,将XML转换回Map。 例: 结果: 然后回来: 我不想使用JAXB或JSON转换API。只需简单的情况,它就不必处理嵌套的地图或属性或其他任何内容。有什么建议么? 编辑:我创建了一个工作副本并粘贴示例。感谢fvu和Michal Bernhard。 下载最新的XStream框架,“仅核心”就足够了。 不需要转换器或其他任

  • 好的,我有三个实体:主题、用户、类别、图片。用户有图片,主题有用户和类别。 我还有一个话题要讲 我可以将ModelMapper注入TopicService,并使用它进行转换,但它不能按照我的需要工作,在这种情况下,如果我试图将Topic转换为TopicDTO,在转换后的TopicDTO对象中,UserDTO和CategoryTo将为null,但在调试中,在转换之前,在Topic对象中,Catego

  • 问题内容: 我想将Java Date转换为Microsoft OLE Automation-OADate类型或想将OADa​​te转换为Java Date。OADate for Java的公式是什么?实际上,我已经在stackoverflow中进行了搜索,但是找不到答案,我得到了答案,并且想在这个社区中分享它。 例如: 43013.7659837837963 等于 EET 2017年10月5日星期

  • 问题内容: 有没有办法将netty ByteBuf转换为String,反之亦然? 问题答案: 您可以使用转换为字符串。 您可以使用和转换为ByteBuf。

  • 问题内容: 如果我有RGB小数,例如,我该怎么做才能将其转换为CMYK? 例如: 问题答案: 这是Javascript实现的Python端口。