我正在寻求帮助来理解为什么 json_decode 返回标量而不是哈希值。我仍在学习 perl 和描述或一些参考文献。会很好。

所以问题是:为什么 json_decode 返回标量?(还是不是标量)我有更好的方法可以使用数据吗?

这是我的代码:

use strict;
use warnings;
use JSON qw(decode_json);
use LWP::UserAgent;

my $url = "http://api.bf4stats.com/api/playerInfo?plat=xbox&name=Ttylz00&output=json";

my $ua = LWP::UserAgent->new;
my $data = $ua->get($url);
my $json;
if($data->is_success){
    $json = decode_json($data->decoded_content);
}

&sData($json);

sub sData {
    my $data = $_[0];
    my $kdr = int($data->{stats}->{extra}->{kdr}*100)/100;
    printf "\nName: %s\nRank: %s, %s\nKDR: %s\n", $data->{player}->{name}, 
        $data->{player}->{rank}->{nr}, $data->{player}->{rank}->{name}, 
        $kdr;
}
有帮助吗?

解决方案

在 Perl 中,函数只能真正返回标量或列表。

由于哈希值可以从列表中初始化或分配(例如 %foo = (a => 1, b => 2)),我猜你是在问为什么 json_decode 返回类似的东西 { a => 1, b => 2 } (对匿名哈希的引用)而不是 (a => 1, b => 2) (可以复制到哈希中的列表)。

我可以想到几个很好的理由:

  • 在 Perl 中,数组或散列始终包含标量。所以在类似的事情中 { "a": { "b": 3 } }, , 这 { "b": 3 } 部分 是一个标量;为了保持一致性,将整个事物以相同的方式作为标量是有意义的。
  • 如果散列非常大(顶层有许多键),则迭代所有元素以将其转换为列表,然后从该列表构建新散列是毫无意义且昂贵的。
  • 在 JSON 中,顶级元素可以是对象(= Perl 哈希)或数组(= Perl 数组)。如果 json_decode 在前一种情况下返回一个列表,目前尚不清楚在后一种情况下会返回什么。解码 JSON 字符串后,如何检查结果以了解如何处理它?(这样写是不安全的 %foo = json_decode(...) 除非你已经知道你有一个哈希值。)所以 json_decode的行为对于任何必须在不太了解其正在使用的数据的情况下使用它的通用库代码来说效果更好。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top