package MyClassA; use strict; use warnings 'all'; sub new { my $classname = shift; my $self = {}; bless($self, $classname); my %extras = @_; @$self{keys %extras} = values %extras; return $self; } sub TO_JSON { my $self = shift; return { %{$self} }; } sub setClassB { my $self = shift; $self->{MY_CLASS_B} = shift; } sub getClassB { my $self = shift; return $self->{MY_CLASS_B}; } 1; #### package MyClassB; use strict; use warnings 'all'; sub new { my $classname = shift; my $self = {}; bless($self, $classname); my %extras = @_; @$self{keys %extras} = values %extras; return $self; } sub TO_JSON { my $self = shift; return { %{$self} }; } sub getName { my $self = shift; return $self->{NAME}; } 1; #### use strict; use warnings 'all'; use JSON::MaybeXS ':all'; use MyClassA; use MyClassB; my $a = MyClassA->new(NAME => 'A instance'); my $b = MyClassB->new(NAME => 'B instance'); $a->setClassB($b); print JSON->new()->convert_blessed()->encode($a) . "\n"; #### use strict; use warnings 'all'; use JSON::MaybeXS ':all'; use MyClassA; use MyClassB; my $line = ; my $a = bless(JSON->new()->decode($line), 'MyClassA'); print $a->getClassB()->getName() . "\n";