【问题标题】:Decoding Hash from JSON-String in Perl在 Perl 中从 JSON-String 解码哈希
【发布时间】:2015-08-25 20:50:03
【问题描述】:

为什么这不起作用?

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 字符串中恢复正确的哈希值?

【问题讨论】:

  • 您从哪个模块获得encode_jsondecode_json
  • 我包括使用 JSON;
  • 您可以取消引用哈希,my %myHashDecoded = %{ decode_json($enableInputEncoded) };

标签: json perl hash


【解决方案1】:

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

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

所以你得到了你输入的内容。你输入了一个 hashref,你得到了一个 hashref。

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

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

【讨论】:

  • 感谢您的快速回复。并为我对文档的无知感到抱歉。
  • 这确实帮助我了解了 Perl 的某些方面,这些方面(作为一个新手)对我来说没有多大意义。谢谢!
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    在以下行中,您做了两件事:创建对哈希的引用 (\),并对结果进行编码 (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);
    

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

    【讨论】:

      【解决方案4】:

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

      解决方案:

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

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

      【讨论】:

        猜你喜欢
        • 2012-01-05
        • 2016-07-25
        • 1970-01-01
        • 1970-01-01
        • 2016-08-19
        • 1970-01-01
        • 2013-07-09
        • 2012-06-01
        • 2011-06-14
        相关资源
        最近更新 更多