为什么json_decode会返回一个标量?

时间:2013-11-17 23:17:11

标签: json perl hash reference scalar

我正在寻找帮助,理解为什么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;
}

1 个答案:

答案 0 :(得分:2)

在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的行为对于任何必须使用它的通用库代码都更好已经非常了解它正在使用的数据。