如何将Perl对象转换为JSON字符串

6

我尝试了很多次将perl对象转换成JSON字符串,但仍然无法实现。我使用了JSYNC,但是发现它有些问题,于是我使用了perl中的JSON模块。

这是我的代码。

my $accountData = AccountsData ->new();
$accountData->userAccountsDetail(@userAccData);
$accountData->creditCardDetail(@userCrData);
my $json = to_json($accountData,{allow_blessed=>1,convert_blessed=>1});
print $json."\n";

我运行代码时打印出了null。我做错了什么吗?


2个回答

8

第一个版本:

use JSON::XS;
use Data::Structure::Util qw/unbless/;


sub serialize {
  my $obj = shift;
  my $class = ref $obj;
  unbless $obj;
  my $rslt = encode_json($obj);
  bless $obj, $class;
  return $rslt;
}

sub deserialize {
  my ($json, $class) = @_;
  my $obj = decode_json($json);
  return bless($obj, $class);
}

第二版:
package SerializablePoint;

use strict;
use warnings;
use base 'Point';

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

1;

package main;

use strict;
use warnings;
use SerializablePoint;
use JSON::XS;

my $point = SerializablePoint->new(10, 20);

my $json = JSON::XS->new->convert_blessed->encode($point);
print "$json\n";
print "point: x = ".$point->get_x().", y = ".$point->get_y()."\n";

3
通常最好直接使用JSON而不是JSON::XS。如果可用,则会使用JSON::XS,否则将回退到纯Perl版本。 - Quentin
1
非常感谢。我使用了JSON::XS并解决了我的问题。 - Amila
1
为了获得“漂亮”的输出:use JSON qw(encode_json)(而不是JSON::XS),然后: sub serialize { my $json = JSON->new->utf8; ... my $rslt = $json->pretty->encode($obj); ... } - lepe

2
根据文档,您的对象必须提供一个TO_JSON方法,然后to_json将使用该方法。文档还暗示,如果您想避免提供自己的TO_JSON方法,那么在转换之前可以调用JSON-convert_blessed_universally;,但文档指出这是实验性功能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接