Perl:通过类中的同一对象访问方法和 json hashref 数据



我有一个对象类,它通过文件读写功能扩展了JSON。 从类使用的角度来看,我既想使用类的方法,又想使用相同的对象访问 json 哈希。

例如,我将用静态字符串的from_json和to_json替换文件处理,但原理是相同的。

我的"用户"代码

use Extended::JSON;
my $config = Extended::JSON->open('{"Data":{"Property":"Data in json"}}');
print "Data from json: " . $config->{Data}->{Property} . "n";
$config->{Data}->{Property} = 'New Data in json';
$config->write();

我的班级

use JSON;
package Extended::JSON;
sub open
{
my $class = shift;
my $data = shift;
my self = { _jsonhash => from_json( $data ) };
};
bless $self, $class;
return $self;
}
sub write
{
my $self = shift;
print to_json( $self->{_jsonhash} );
}

如您所见,"user"代码应该能够使用类属性直接从from_json访问和更改重新处理哈希,但这些方法应该与类一样。 我错过了,如果有可能在某个地方普遍"包装"对类方法的属性访问以更改 json 哈希,而不是对象属性。

谢谢! 基督教

如果类没有属性(对象变量(,则可以使用from_json返回的变量作为对象。

package Extended::JSON;
use strict;
use warnings;
use feature qw( say );
use JSON qw( from_json to_json );
sub open {
my ($class, $json) = @_;
return bless(from_json($json), $class);
}
sub write {
my ($self) = @_;
say to_json($self);
}
1;

如果类具有属性,则仍然可以使用该方法,方法是在重新生成 JSON 时隐藏它们。

package Extended::JSON;
use strict;
use warnings;
use feature qw( say );
use JSON qw( from_json to_json );
sub open {
my ($class, $json) = @_;
my $self = bless(from_json($json), $class);
# $self->{_foo} = ...;
return $self;
}
sub write {
my ($self) = @_;
delete local @$self{ grep /^_/, keys(%$self) };
say to_json($self);
}
1;

上述要求 JSON 的顶级是一个"对象"(哈希(,并且它会阻止在该对象中使用某些键。为了避免这些限制,我们可以使用重载。

package Extended::JSON;
use strict;
use warnings;
use feature qw( say );
use JSON qw( from_json to_json );
use overload '%{}' => &data;
sub open {
my ($class, $json) = @_;
my $self = bless({}, $class);
$$self->{data} = from_json($json);
# $$self->{foo} = ...;
return $self;
}
sub write {
my ($self) = @_;
say to_json($$self->{data});
}
sub data {
my ($self) = @_;
return $$self->{data};
}
1;

上面创建了一个基于标量的对象(而不是基于哈希的对象(。将引用视为哈希引用获取从 JSON 获取的数据,而将引用视为标量引用获取"真实"对象。

$ perl -e'
use Extended::JSON qw( );
my $o = Extended::JSON->open(q{{"a":123}});
CORE::say $o->{a};
$o->write;
'
123
{"a":123}

最新更新