2017-07-03 21 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 … 

我期望serialiser能夠找到安裝好的掛鉤並使用它,但是我卻得到了上面的錯誤。出了什麼問題?

+0

歡迎回來:) – simbabque

回答

4

爲了使JSON::XS考慮TO_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(或缺失),則在遇到祝福對象時進行編碼,將檢查對象類上TO_JSON方法 的可用性。如果找到,將在標量上下文中調用 ,並且生成的標量將被編碼而不是該對象。

如果需要,TO_JSON方法可以安全地調用die。如果TO_JSON返回其他祝福的對象,那麼將以相同的方式處理這些對象。 在這種情況下,TO_JSON必須注意不要造成無限的遞歸循環(== 崩潰)。 TO_JSON的名稱被選中是因爲Perl核心調用的其他方法(==不是該對象的用戶)是 ,通常採用大寫字母,並避免與任何to_json 函數或方法衝突。

如果$啓用爲假(默認值),則編碼不會考慮這種類型的轉換。

此設置對解碼沒有影響。

(重點煤礦)

相關問題