Takamoto has asked for the wisdom of the Perl Monks concerning the following question:

Dear Monks,

I am trying to parse the json response I get with:

$query='AA Tauri'; my $url = 'https://en.wikipedia.org/w/api.php?format=json&action=query +&prop=extracts&exintro&explaintext&redirects=1&titles=' . $query; my $ua = LWP::UserAgent->new; my $req = HTTP::Request->new(GET => $url); my $response = $ua->request($req); if ($response->is_success) { print "SUCCESS!\n"; my $json_text= $response->content; my $decoded_json = decode_json( $json_text ); print Dumper $decoded_json; }

The result of Dumper is:

$VAR1 = { 'query' => { 'pages' => { '25111030' => { 'pageid' => 251110 +30, 'extract' => 'AA T +auri is a young star in the constellation of Taurus, located in the y +oung Taurus-Auriga Star Forming Region, roughly at 460 light years aw +ay from the Sun.', 'title' => 'AA Tau +ri', 'ns' => 0 } } }, 'batchcomplete' => '' };

I get a hash of hashes (never been good with...). I need to put into a scalar the value of 'extract'. Normally I go directly to a particular value given the keys that define it, something like:

my $val = $decoded_json {query}{pages}{XXX}{extract};

But the value in XXX is always different. How can I get the value of 'extract'?

Replies are listed 'Best First'.
Re: hash of hashes parsing problem
by tybalt89 (Monsignor) on Dec 29, 2018 at 23:27 UTC
    my $val = (%{$decoded_json{query}{pages}})[1]->{extract};
      A bit more clearly:
      my $pages = $data->{query}{pages}; my ($page_id) = keys(%$pages); my $page = $pages->{$page_id}; my $extract = $page->{extract}; ...

      Or if you don't need the page id:

      my $pages = $data->{query}{pages}; my ($page) = values(%$pages); my $extract = $page->{extract}; ...

      The layout suggests that multiple pages could be returned.

      my $pages = $data->{query}{pages}; for my $page_id (keys(%$pages)) { my $page = $pages->{$page_id}; my $extract = $page->{extract}; ... }

      Or if you don't need the page id:

      my $pages = $data->{query}{pages}; for my $page (values(%$pages)) { my $extract = $page->{extract}; ... }
Re: hash of hashes parsing problem
by Takamoto (Monk) on Dec 30, 2018 at 08:58 UTC

    Thank you tybalt89 and ikegami. Not only your solutions work, but I also understood the way to solve my page id problem.