Разбор выходного массива JSON Data::Dumper в Perl

Я пытаюсь отредактировать старый Perl-скрипт, и я совсем новичок. Запрос с сервера возвращается как:

$VAR1 = [
          {
            'keywords' => [
                            'bare knuckle boxing',
                            'support group',
                            'dual identity',
                            'nihilism',
                            'support',
                            'rage and hate',
                            'insomnia',
                            'boxing',
                            'underground fighting'
                          ],
          }
        ];

Как я могу разобрать эту строку JSON, чтобы захватить:

$keywords = "bare knuckle boxing,support group,dual identity,nihilism,support,rage and hate,insomnia,boxing,underground fighting"

Полный Perl-код

#!/usr/bin/perl

use LWP::Simple;                # From CPAN
use JSON qw( decode_json );     # From CPAN
use Data::Dumper;               # Perl core module
use strict;                     # Good practice
use warnings;                   # Good practice
use WWW::TheMovieDB::Search;
use utf8::all;
use Encode;
use JSON::Parse 'json_to_perl';
use JSON::Any;
use JSON;

my $api = new WWW::TheMovieDB::Search('APIKEY');
my $img = $api->type('json');
$img = $api->Movie_imdbLookup('tt0137523');

my $decoded_json = decode_json( encode("utf8", $img) );

print Dumper $decoded_json;

Спасибо.


person user1882536    schedule 26.02.2013    source источник
comment
Это не строка JSON, это вывод Data::Dumper.   -  person TLP    schedule 26.02.2013
comment
Вы просматривали JSON.pm   -  person vol7ron    schedule 26.02.2013
comment
да, это Data::Dumper output   -  person user1882536    schedule 26.02.2013
comment
@user1882536 user1882536 Я знаю, я уже говорил это. Итак, вопрос в том, является ли это фактически вводом, с которым вам нужно работать, или это переменная, с которой, по вашему мнению, было бы неплохо распечатать ее содержимое для этого вопроса?   -  person TLP    schedule 26.02.2013
comment
@user1882536 user1882536 — Пожалуйста, ответьте на вопрос TLP вместо того, чтобы повторять исходный вопрос.   -  person Quentin    schedule 26.02.2013
comment
@TLP да, мне нужно распечатать print $keywords;   -  person user1882536    schedule 26.02.2013
comment
@ user1882536 — Это был не его вопрос. Вы разместили некоторые данные в вопросе. Это похоже на вывод Data::Dumper. У вас есть этот текст в файле в таком формате, который вам нужно разобрать? Если нет, то каков реальный вклад, с которым вам приходится иметь дело? В вашем заголовке упоминается JSON, но там нет JSON. Подразумевается то, что вы уже проанализировали некоторый JSON и вам просто нужно перемещаться по структуре данных Perl, но это не обязательно.   -  person Quentin    schedule 26.02.2013
comment
Откуда взялись данные, которые вы сбросили с помощью Data::Dumper?   -  person Borodin    schedule 26.02.2013
comment
@Quentin, я отредактировал и добавил полный код, пожалуйста, смотрите   -  person user1882536    schedule 26.02.2013
comment
@Borodin, я добавил полный Perl-код, о котором идет речь   -  person user1882536    schedule 26.02.2013


Ответы (3)


Основываясь на комментариях и вашем недавнем редактировании, я бы сказал, что вы спрашиваете, как перемещаться по структуре данных perl, содержащейся в переменной $decoded_json.

my $keywords = join ",", @{ $decoded_json->[0]{'keywords'} };
person TLP    schedule 26.02.2013
comment
Нельзя использовать неопределенное значение в качестве ссылки на МАССИВ в строке 31 testjson.pl. - person user1882536; 26.02.2013
comment
$decoded_json не может быть одновременно и тем, что вы напечатали в Data::Dumper, и неопределенным. Итак, нет. Этого не может быть. - person TLP; 26.02.2013
comment
скопируйте тот же код, который вы указали, и добавьте последнюю печать $keywords; но получаю ошибку Невозможно использовать неопределенное значение в качестве ссылки на МАССИВ - person user1882536; 26.02.2013
comment
@user1882536 user1882536 Да, вам не нужно повторять очевидные вещи. Вы не можете иметь переменную, которая одновременно не определена и содержит данные. Это не то, что может произойти одновременно. Так что НЕТ, то, что вы только что сказали, не может произойти. Если это действительно произошло, то это потому, что вы изменили что-то еще, так что ваш вывод Dumper теперь равен $VAR1 = undef. Это не имеет ничего общего с моим кодом. - person TLP; 26.02.2013
comment
пожалуйста, сэр, проверьте свой полный код, опубликованный и проверьте вывод Dumper, также поместите свой код в мой полный код - person user1882536; 26.02.2013
comment
@ user1882536 Ключ «genres» содержит массив, содержащий хэши, из которых ключ «name» содержит различные жанры, поэтому вы не можете использовать для этого массив. $VAR1->[0]{'genres'}[0]{name} равно драме, $VAR1->[0]{'genres'}[1]{name} равно действию и т. д. Самый простой способ — перебрать @{ $VAR1->[0]{'genres'} } в цикле и поместить $_->{'name'} в массив. Подробнее о структурах данных perl см. в perldoc.perl.org/perldata.html. - person TLP; 26.02.2013

say qq{ @{ $arrayref->[0]->{'keywords'} } };

Как указал TLP, все, что вы показали, - это комбинация массивов/хэшей perl. Но если вы иметь строку JSON.

person vol7ron    schedule 26.02.2013

Представленный вами результат похож на json, но его Perl-вариант. (т.е. => вместо : и т.д.). Я не думаю, что вам нужно изучать часть json, поскольку вы уже получили данные. Вам просто нужно использовать Perl для объединения данных в текстовую строку.

Просто чтобы уточнить решение vol7ron :

#get a reference to the list of keywords
my $keywords_list = $decoded_json->[0]{'keywords'};
#merge this list with commas
my $keywords = join(',', @$keywords_list );
print $keywords;
person FtLie    schedule 26.02.2013
comment
я получаю сообщение об ошибке Невозможно использовать неопределенное значение в качестве ссылки на МАССИВ - person user1882536; 26.02.2013
comment
Тогда $decoded_json должен быть undef. Попробуйте распечатать Dumper $decoded_json; а если внутри нет данных, то ошибка где-то в другом месте. если 'keywords' иногда имеет значение undef, и во избежание особых случаев используйте #ie по умолчанию для ссылки на пустой массив my $keywords_list = $decoded_json-›[0]{'keywords'} || [] ; - person FtLie; 27.02.2013