我使用Perl JSON
模块将Perl哈希转换为JSON字符串。我无法弄清楚如何在保留以前分配的键和值的同时为散列数组添加新的哈希值。
我正在尝试创建以下JSON:
{
"key1":"value1",
"key2":"value2",
"arrayOfHash":[
{
"key1-1":"value1-1",
"key1-2":"value1-2"
},
{
"key2-1":"value2-1",
"key2-2":"value2-2"
}
]
}
以下是代码:
use JSON; # imports encode_json, decode_json, to_json and from_json.
$json{key1} = "value1";
$json{key2} = "value2";
%hash = ();
$hash{'key1-1'} = "value1-1";
$hash{'key1-2'} = "value1-2";
push(@{ $json{arrayOfHash} }, \%hash);
%hash = ();
$hash{'key2-1'} = "value2-1";
$hash{'key2-2'} = "value2-2";
push(@{ $json{arrayOfHash} }, \%hash);
$json = encode_json(\%json);
我得到的是:
{
"key1":"value1",
"key2":"value2",
"arrayOfHash":[
{
"key2-1":"value2-1",
"key2-2":"value2-2"
},
{
"key2-1":"value2-1",
"key2-2":"value2-2"
}
]
}
答案 0 :(得分:5)
问题是%hash
每次引用相同的哈希值 - 当你说
%hash = ();
你没有创建一个新的哈希,你只是清空那个哈希。这有两种方法可以做你想要的。首先,您可以从开头使用显式哈希引用:
use JSON; # imports encode_json, decode_json, to_json and from_json.
$json{key1} = "value1";
$json{key2} = "value2";
$hash = {};
$hash->{'key1-1'} = "value1-1";
$hash->{'key1-2'} = "value1-2";
push(@{ $json{arrayOfHash} }, $hash);
$hash = {};
$hash->{'key2-1'} = "value2-1";
$hash->{'key2-2'} = "value2-2";
push(@{ $json{arrayOfHash} }, $hash);
$json = encode_json(\%json);
print $json;
其次,既然你似乎真的想尽可能避免引用,你可以使用块和my
声明来使两个%hash
事物变得不同:
use JSON; # imports encode_json, decode_json, to_json and from_json.
$json{key1} = "value1";
$json{key2} = "value2";
{
my %hash = ();
$hash{'key1-1'} = "value1-1";
$hash{'key1-2'} = "value1-2";
push(@{ $json{arrayOfHash} }, \%hash);
}
{
my %hash = ();
$hash{'key2-1'} = "value2-1";
$hash{'key2-2'} = "value2-2";
push(@{ $json{arrayOfHash} }, \%hash);
}
$json = encode_json(\%json);
print $json;
这些方法中的任何一种都可以达到你想要的效果。
答案 1 :(得分:4)
您正在引用哈希,然后更改哈希。引用不会创建哈希的副本,而是仍然指向相同的数据结构。 (有关在Perl中创建和使用引用的详细信息,请参阅perlref和perlreftut。)
相反,您需要:
push(@{ $json{arrayOfHash} }, {%hash});
或者:
push(@{ $json{arrayOfHash} }, {
'key1-1' => 'value1-1',
'key1-2' => 'value1-2',
});
您还应该在您编写的每个Perl文件的顶部use strict
和use warnings
。