【问题标题】:Problems parsing Reddit's JSON解析 Reddit 的 JSON 的问题
【发布时间】:2012-07-21 23:48:23
【问题描述】:

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

但是我确实对 perl 和 json 都非常陌生。

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

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

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 时,this one for example,它有不同的格式,我不知道如何解析它。如果我尝试与解析器崩溃之前相同的操作,则说它不是 HASH 引用。

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

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

【问题讨论】:

  • 使用Data::Dumper 打印出你认为应该是哈希引用的变量的值,看看它到底是什么。
  • 您的my %phsh = (); 每次循环都会(重新)初始化该哈希。
  • 哦,谢谢@Kenosis,我什至没有注意到 XD
  • my %phsh = (); 最好写成my %phsh;

标签: json perl reddit


【解决方案1】:

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

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

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

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";
}

【讨论】:

  • 啊,谢谢!该代码运行良好。该代码使我完美地获得了cmets。但即使使用相同的想法,我也无法在 json 的头部获取 post 数据。你能告诉我它的语法吗? (无论如何你都会得到答案,非常感谢!)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多