Perl
JSON

JSONからPerlオブジェクトを生成する方法

まさにこれ。
How to convert Perl objects into JSON and vice versa - Stack Overflow(PerlオブジェクトをJSONに変換するにはどうすれば?またその逆は?)

要点

  • Blessed Objectはそのままencodeしようとするとエラーになるよ

 encountered object 'Person=HASH(0x11d6d40)', but neither allow_blessed nor convert_blessed settings are enabled at sample.pl line 24.

  • allow_blessedが有効だと例外エラーしなくなるよ。代わりにnullが返るよ。
  • convert_blessedを有効にするとBlessed ObjectのTO_JSONが呼ばれてそれを使うよ。
  • sub TO_JSON { return { %{ shift() } }; }という風に書いてハッシュに変換するといいよ。
  • でもこれだと何のObjectかわからないから、__CLASS__フィールドを用意しておくといいよ。
  • JSONをインスタンスに変換するのはPerlに限らず、他の言語でも必要だよ。

実例

#!/usr/bin/perl

package Person {
    use v5.10;
    use warnings;
    use Moo;

    has 'num' => (is => 'rw', default => 22);
    has 'hash' => (is => 'rw', default => sub { { a => 22} } );
    has '__CLASS__' => (is => 'ro', default => __PACKAGE__);

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

use v5.10;
use warnings;
use Data::Dumper;
use JSON;

# Objectを生成
my $obj = Person->new();
say Dumper $obj;

# JSONに変換
my $json_text = JSON->new->utf8->allow_blessed->convert_blessed->encode($obj);
#my $json_text = JSON->new->utf8->allow_blessed->encode($obj);
die "return null" if $json_text eq "null";
say $json_text;
# ↑convert_blessedを付けない場合nullが返る

# JSONからObjectを生成
my $ref = JSON->new->decode($json_text);
say Dumper $ref;
my $obj2 = bless($ref, $ref->{__CLASS__});
say Dumper $obj2;
__END__
$VAR1 = bless( {
                 'hash' => {
                             'a' => 22
                           },
                 '__CLASS__' => 'Person',
                 'num' => '22'
               }, 'Person' );

{"__CLASS__":"Person","hash":{"a":22},"num":"22"}
$VAR1 = {
          'hash' => {
                      'a' => 22
                    },
          '__CLASS__' => 'Person',
          'num' => '22'
        };

$VAR1 = bless( {
                 'hash' => {
                             'a' => 22
                           },
                 '__CLASS__' => 'Person',
                 'num' => '22'
               }, 'Person' );

参考

moose - Unblessing Perl objects and constructing the TO_JSON method for convert_blessed - Stack Overflow https://stackoverflow.com/questions/25508197/unblessing-perl-objects-and-constructing-the-to-json-method-for-convert-blessed

blessされたオブジェクトをJSONに変換 - hounobouno http://koizuss.hatenablog.com/entry/20090605/1244174060

How to convert Perl objects into JSON and vice versa - Stack Overflow https://stackoverflow.com/questions/4185482/how-to-convert-perl-objects-into-json-and-vice-versa

JSON - JSON (JavaScript Object Notation) encoder/decoder - metacpan.org https://metacpan.org/pod/JSON