【发布时间】:2016-10-24 17:00:52
【问题描述】:
我有下面给出的JSON 文本:
test.json
{
"a" : false
}
我想为上述 JSON 创建 DBM::Deep 哈希。我的代码如下所示:
dbm.pl
use strict;
use warnings;
use DBM::Deep;
use JSON;
use Data::Dumper;
# create the dbm::deep object
my $db = DBM::Deep->new(
file => 'test.db',
type => DBM::Deep->TYPE_HASH
);
my $json_text = do {
open( my $json_fh, $path )
or die("Can't open \$path\": $!\n");
local $/;
<$json_fh>;
};
my $json = JSON->new;
my $data = $json->decode($json_text);
print Dumper($data);
# create dbm::deep hash
eval { $db->{$path} = $data; };
if ($@) {
print "error : $@\n";
}
我在执行上述代码时低于输出/错误:
错误
$VAR1 = { 'a' => bless(do{(my $o = 0)}, 'JSON::XS::Boolean' ) }; 错误:DBM::Deep:不支持“SCALAR”类型的引用存储。在 dbm.pl 第 26 行
看起来,JSON 在内部使用 JSON::XS 来转换 JSON::XS::Boolean 对象中的“真”值,而 DBM::Deep 无法处理这个,而它可以处理空值。
虽然上述代码适用于以下输入:
{
"a" : 'true' # if true is in quotes
}
或
{
"a" : null
}
我尝试了很多东西,但没有任何效果。有人有解决方法吗?
【问题讨论】:
-
出于好奇,为什么不直接存储原始 JSON 而不是使用 DBM::Deep?
-
我的要求是将json结构(最高4-5级深度)存储在一些内存数据库中,以便存储后可以访问它们。
-
默认情况下,DBM::Deep 将数据存储在文件中,而不是内存数据库中。你能更清楚地解释一下你的要求吗?我还是不明白为什么你不每次要使用原始 JSON 文件时就反序列化它。
-
我的坏:我想将数据存储在持久内存中,也可以是文件。因此我选择了 DBM::Deep。
-
一个 JSON 文件是持久化的。