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に行くと、たとえばこれはフォーマットが異なり、解析方法がわかりません。パーサーがクラッシュする前と同じことを試してみると、ハッシュ参照ではないと言っています。

だから私の質問は:2番目の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 に答える