1

我正在研究一个使用 JSON 模块解析 reddit 的 JSON 的 perl 脚本。

但是我确实有一个对 perl 和 json 都非常陌生的问题。

我成功地解析了首页和子版块,但评论的结构不同,我不知道如何访问我需要的数据。

这是成功找到首页和子版块的“数据”哈希的代码:

foreach my $children(@{$json_text->{"data"}->{"children"}}) #For values of children.
{
    my $data = $children->{"data"}; #accessing each data hash.
    my %phsh = ();                  #my hash to collect and print.

            $phsh{author} = $data->{"author"};#Here I get the "author" value from "data"
*Etc....

这成功地从http://www.reddit.com/.json获得了我需要的东西

但是当我转到评论的 json 时,例如这个,它有不同的格式,我不知道如何解析它。如果我尝试与解析器崩溃之前相同的操作,则说它不是 HASH 引用。

所以我的问题是:如何访问第二个 JSON 中的“孩子”?我需要同时获取帖子的数据和评论的数据。有人可以帮忙吗?

提前致谢!(我知道这可能很明显,但我的睡眠很少 XD)

4

1 回答 1

3

您需要查看 JSON 数据或转储解码的数据以查看它采用什么形式。例如,评论数据是顶层的数组。

这是一些打印body所有顶级注释字段的代码。请注意,评论可能在其replies字段中有一组回复,并且每个回复也可能依次有回复。

根据您想要执行的操作,您可能需要通过检查ref操作符返回的值来检查引用是对数组还是散列。

use strict;
use warnings;

binmode STDOUT, ':utf8';

use JSON;
use LWP;
use Data::Dump;

my $ua = LWP::UserAgent->new;
my $resp = $ua->get('http://www.reddit.com/r/funny/comments/wx3n5/caption_win.json');
die $resp->status_line unless $resp->is_success;

my $json = $resp->decoded_content;
my $data = decode_json($json);

die "Error: $data->{error}" if ref $data eq 'HASH' and exists $data->{error};

dd $data->[1]{data}{children}[0];
print "\n\n";

my $children = $data->[1]{data}{children};
print scalar @$children, " comments:\n\n";

for my $child (@$children) {
  print $child->{data}{body}, "\n";
}
于 2012-07-21T15:48:23.077 回答