2013-11-17 4 views
1

Я ищу помощь, чтобы понять, почему json_decode возвращает скаляр вместо хэша. Я все еще изучаю perl и описание или некоторую ссылку. было бы замечательно.Почему json_decode возвращает скаляр?

Итак, вопросы: Почему 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; 
} 

ответ

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 работает лучше для любого общедоступного библиотечного кода, который должен использовать его, не зная очень многое о данных, работать с.
Смежные вопросы