2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

まさにこれ。
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

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?