为什么这不起作用?
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字符串中恢复正确的哈希?
答案 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);
顺便说一句,使用引用的原因是不可能将哈希传递给子或从子返回哈希。只能传递和返回标量列表。