Perl: как перебирать массивы в нескольких объектах и ​​извлекать значения из веб-службы

Я запрашиваю веб-сервис и получаю ответ JSON:

{
   "timestamp" : "2019-06-11T08:04:35Z",
   "version" : "0.5",
   "document" : [
      {
         "href" : "http://opac.sub.uni-goettingen.de/DB=1/PPNSET?PPN=1629107239",
         "item" : [
            {
               "href" : "http://opac.sub.uni-goettingen.de/DB=1/PPNSET?PPN=1629107239",
               "label" : "40 623 a",
               "id" : "http://uri.gbv.de/document/opac-de-7:epn:3421084610",
               "available" : [
                  {
                     "service" : "presentation"
                  }
               ],
               "unavailable" : [
                  {
                     "service" : "loan"
                  },
                  {
                     "service" : "interloan"
                  }
               ]
            },
            {
               "href" : "http://opac.sub.uni-goettingen.de/DB=1/PPNSET?PPN=1629107239",
               "label" : "40 623 b",
               "id" : "http://uri.gbv.de/document/opac-de-7:epn:342108467X",
               "available" : [
                  {
                     "service" : "presentation"
                  }
               ],
               "unavailable" : [
                  {
                     "service" : "loan"
                  },
                  {
                     "service" : "interloan"
                  }
               ]
            }
         ],
         "id" : "http://uri.gbv.de/document/opac-de-7:ppn:1629107239"
      }
   ],
   "institution" : {
      "href" : "http://www.sub.uni-goettingen.de",
      "content" : "Niedersächsische Staats- und Universitätsbibliothek Göttingen",
      "id" : "http://uri.gbv.de/organization/isil/DE-7"
   }
}

Затем я анализирую JSON с помощью модуля Perls Dumper::Data:

my $data = decode_json($resultJson);
print Dumper($data);

Это выглядит как:

$VAR1 = {
          'document' => [
                          {
                            'item' => [
                                        {
                                          'available' => [
                                                           {
                                                             'service' => 'presentation'
                                                           }
                                                         ],
                                          'id' => 'http://uri.gbv.de/document/opac-de-7:epn:3421084610',
                                          'href' => 'http://opac.sub.uni-goettingen.de/DB=1/PPNSET?PPN=1629107239',
                                          'label' => '40 623 a',
                                          'unavailable' => [
                                                             {
                                                               'service' => 'loan'
                                                             },
                                                             {
                                                               'service' => 'interloan'
                                                             }
                                                           ]
                                        },
                                        {
                                          'available' => [
                                                           {
                                                             'service' => 'presentation'
                                                           }
                                                         ],
                                          'unavailable' => [
                                                             {
                                                               'service' => 'loan'
                                                             },
                                                             {
                                                               'service' => 'interloan'
                                                             }
                                                           ],
                                          'id' => 'http://uri.gbv.de/document/opac-de-7:epn:342108467X',
                                          'label' => '40 623 b',
                                          'href' => 'http://opac.sub.uni-goettingen.de/DB=1/PPNSET?PPN=1629107239'
                                        }
                                      ],
                            'id' => 'http://uri.gbv.de/document/opac-de-7:ppn:1629107239',
                            'href' => 'http://opac.sub.uni-goettingen.de/DB=1/PPNSET?PPN=1629107239'
                          }
                        ],
          'institution' => {
                             'content' => "Nieders\x{e4}chsische Staats- und Universit\x{e4}tsbibliothek G\x{f6}ttingen",
                             'id' => 'http://uri.gbv.de/organization/isil/DE-7',
                             'href' => 'http://www.sub.uni-goettingen.de'
                           },
          'timestamp' => '2019-06-11T08:04:35Z',
          'version' => '0.5'
        };

Я хотел бы отобразить доступность каждого элемента, но мне трудно перебирать массивы внутри объектов. Мой фактический код выглядит так:

my $availability = $data->{document}[0]->{item}[0]->{available};

foreach my $key (@{$availability}) {
    if (($key->{'service'}) eq "loan") {
        print $rueckgabe = "Loan: available.\n";
    } elsif (($key->{'service'}) eq "presentation") {
        print $rueckgabe = "Presentation: available.\n";
    } elsif (($key->{'service'}) eq "interloan") {
        print $rueckgabe = "ILL: available.\n";
    } 
}

Моим ожидаемым результатом будет:

Пункт 1: Кредит: имеется.

Пункт 2: Кредит: имеется.

Если бы я просматривал ваш код в $work в немецкой компании, я бы сказал вам, что смешение немецких и английских имен переменных сбивает с толку. Придерживайтесь английского языка, чтобы ваша компания могла нанимать иностранцев, не говорящих по-немецки. Особенно, если вы работаете в университете.

simbabque 11.06.2019 11:32

Вы совершенно правы. Я просто копировал и вставлял это. Извините за путаницу.

felix 11.06.2019 11:56
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
2
2
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итерация по элементам, для каждого элемента итерация по доступности.

for my $i (0 .. $#{ $data->{document}[0]{item} }) {
    print 'Item ', $i + 1, ': ';
    for my $availability ($data->{document}[0]{item}[$i]{available}) {
        for my $key (@$availability) {
            print { interloan => 'ILL' }->{ $key->{service} } || ucfirst $key->{service},
                ": available\n";
        }
    }
}

Другие вопросы по теме