2017-02-08 5 views
0

Я получаю сообщение об ошибке, из-за которого я не могу найти решение для .. Я потратил на это часы и еще не нашел исправления. Может быть, вы могли бы помочь мне? Это в perl, и это код, который я использую.Malformed json string perl, youtube api key

method getMusicInformation($strMusicID) { 
    my $strLink = "https://www.googleapis.com/youtube/v3/videos?id=YqeW9_5kURI&key=AIzaSyBpzQDzTu7e59mxD9HxYP3MTdlCUWzuirQ&part=snippet"; 
    my $strDetails = get($strLink); 
    my $arrDetails = decode_json($strDetails); 
    while (my($key, $value) = each(%{$arrDetails})) { 
     if (ref($value) eq 'ARRAY') { 
      while (my($second_key, $second_value) = each(@{$value})) { 
       return $second_value; 
      } 
     } 
    } 

}

И есть ошибка, я получаю в консоли:

Error: malformed JSON string, neither array, object, number, string or atom, at character offset 0 (before "(end of string)") at Server/Systems/Music.pm line 38. 

Линия 38:

my $arrDetails = decode_json($strDetails); 

Спасибо за понимание.

+1

И какая строка, которую вы пытаетесь запустить 'decode_json' on ??? –

+1

Какой модуль JSON вы используете? Использование JSON.pm и LWP :: Simple it Works For Me ™ – Schwern

+1

'при смещении символов 0 (до« (конец строки) »)' указывает, что пустая строка (или undef) была передана 'decode_json'. – ikegami

ответ

4

Проблема в том, что вы ничего не получаете от get. Запрос не работает, и вы не проверяете наличие ошибки. (Не волнуйтесь, мне тоже понадобилось время, чтобы понять это). Подсказка at character offset 0 означает начало строки.

LWP :: Простой слишком прост и не поддерживает проверку ошибок. Вместо этого используйте полнофункциональный LWP :: UserAgent. К счастью, it's gotten a lot easier to use.

use LWP::UserAgent; 
use Carp; 

... 

my $ua = LWP::UserAgent->new; 
my $response = $ua->get($strLink); 
if(!$response->is_success) { 
    croak "Fetching $strLink failed: ".$response->status_line; 
} 

my $arrDetails = decode_json($response->decoded_content); 

В моем случае проблема заключается в следующем:

Fetching https://www.googleapis.com/youtube/v3/videos?id=YqeW9_5kURI&key=AIzaSyBpzQDzTu7e59mxD9HxYP3MTdlCUWzuirQ&part=snippet failed: 501 Protocol scheme 'https' is not supported (LWP::Protocol::https not installed) at /Users/schwern/tmp/test.pl line 15. 
    main::getMusicInformation(10) called at /Users/schwern/tmp/test.pl line 30 

Так мне нужно установить LWP :: Protocol :: HTTPS, чтобы иметь поддержку протокола HTTPS. Вы, наверное, тоже.