从Perl中的JSON-String解码哈希

时间:2015-06-10 14:19:44

标签: json perl hash

为什么这不起作用?

my $myHashEncoded = encode_json \%myHash;
my %myHashDecoded = decode_json($myHashEncoded);

我收到错误:

Reference found where even-sized list expected at ...

所以我把它改成了:

my $myHashEncoded = encode_json \%myHash;
my $myHashDecoded = decode_json($enableInputEncoded);

但显然%myHash$myHashDecoded不一样。

如何从JSON字符串中恢复正确的哈希?

4 个答案:

答案 0 :(得分:9)

假设您使用的是JSON.pm,the documentation says

  

与encode_json相反:需要一个UTF-8(二进制)字符串并尝试将其解析为UTF-8编码的JSON文本,并返回结果引用

所以你要收回你投入的内容。你正在加入一个hashref并且你得到了一个hashref。

如果你想要一个常规哈希,那么你只需取消引用它就像你对其他hashref一样:

my $myHashRefDecoded = decode_json($myHashEncoded);
my %myHashDecoded = %$myHashRefDecoded;

答案 1 :(得分:3)

您正在将引用编码为哈希(encode_json \%myHash),这是正确的。因此,当您解码JSON字符串时,您将收到对哈希的引用。将% sigil添加到哈希引用中以取消引用它。

$myHashReferenceDecoded = decode_json($myHashReferenceEncoded);
%myHashDecoded = %$myHashReferenceDecoded;

答案 2 :(得分:1)

JSON API是一致的。如果在编码时使用对哈希的引用,则在解码时也会获得哈希引用。 因此,如果要将结果存储在纯哈希变量中,则必须使用decode_json取消引用%{ ... }的结果。

解决方案:

my $myHashEncoded = encode_json \%myHash;
my %myHashDecoded = %{ decode_json($myHashEncoded) };

请注意,取消引用哈希是一项代价高昂的操作。您应该考虑在代码中直接使用引用是否足够。

答案 3 :(得分:1)

在接下来的行中,您要做两件事:创建对哈希的引用(\),然后对结果进行编码(encode_json):

my $myHashEncoded = encode_json(\%myHash);

以下一行,您解码JSON(decode_json),但您没有"撤消"参考。

my %myHashDecoded = decode_json($myHashEncoded);

真正的逆操作将涉及散列解除引用。

my %myHashDecoded = %{ decode_json($myHashEncoded) };

但这不必要地制作哈希的(浅)副本。也许你应该只使用引用。

my $myHashDecoded = decode_json($myHashEncoded);

顺便说一句,使用引用的原因是不可能将哈希传递给子或从子返回哈希。只能传递和返回标量列表。