2017-07-03 12 views
0

サンプルデータベースを使用するにはcpanm --look DBIx::Class ; cd examples/Schema/を実行してください。シリアル化フックが見つからないとJSONが言うのはなぜですか?

use 5.024; 
use strictures; 
use JSON::MaybeXS qw(encode_json); 
use MyApp::Schema qw(); 
use Sub::Install qw(); 

my $s = MyApp::Schema->connect('dbi:SQLite:db/example.db'); 
# Yes, I know Helper::Row::ToJSON exists. 
Sub::Install::install_sub({ 
    code => sub { 
     my ($self) = @_; 
     return { map {$_ => $self->$_} keys %{ $self->columns_info } }; 
    }, 
    into => $s->source('Track')->result_class, 
    as => 'TO_JSON', 
}); 

my ($t) = $s->resultset('Cd')->first->tracks; 
say ref $t->can('TO_JSON'); # 'CODE', ok 
say ref $t->TO_JSON;  # 'HASH', ok 
say encode_json $t; 
# encountered object 'MyApp::Schema::Result::Track=HASH(0x1a53b48)', 
# but neither allow_blessed, convert_blessed nor allow_tags settings 
# are enabled (or TO_JSON/FREEZE method missing) at … 

シリアライザは、インストールされたフックを見つけて使用することを期待していますが、上記のエラーが発生します。何がうまくいかないの?

+0

おかえりなさい:) – simbabque

答えて

4

JSON::XSTO_JSON考えるようにするために、あなたが明示的convert_blessedオプションを有効にする必要があります。

my $coder = JSON::XS->new; 
$coder->convert_blessed(1); 
say $coder->encode($t); 

docsによると:

$json = $json->convert_blessed ([$enable]) 
$enabled = $json->get_convert_blessed 

詳細については、 "オブジェクト直列化" を参照してください。

$ enableがtrue(または不足)の場合、blessされたオブジェクトに遭遇したときエンコードすると、オブジェクトのクラスのTO_JSONメソッド の可用性がチェックされます。見つかった場合はスカラーコンテキスト で呼び出され、結果のスカラーはオブジェクトの代わりにエンコードされます。

TO_JSONメソッドは、必要に応じて安全にdieを呼び出すことができます。 TO_JSONが他の祝福されたオブジェクトを返す場合、それらは同じ方法で処理されます。 この場合、TO_JSONは無限回帰サイクル(== クラッシュ)を引き起こさないように注意する必要があります。 TO_JSONの名前は、他の メソッドがPerlコアによって呼び出されたメソッド(オブジェクトのユーザではない)が通常は大文字で であり、to_jsonの関数またはメソッドとの衝突を避けるために選択されました。

$を有効にした場合(デフォルト) falseで、その後、エンコードは変換のこのタイプを考慮しています。

この設定はデコードには影響しません。

(強調鉱山)

関連する問題