2012-07-21 54 views
1

我正在使用JSON模塊解析reddit的JSON的perl腳本。解析Reddit的JSON的問題

但是我確實遇到了perl和json都很新的問題。

我成功地解析了首頁和子列表,但評論結構不同,我無法弄清楚如何訪問我需要的數據。

下面是成功地找到了頭版的「數據」哈希和subreddits代碼:

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中的「孩子」?我需要獲得郵政的數據和評論的數據。任何人都可以幫忙嗎?

在此先感謝! (我知道這可能很明顯,但我正在運行非常小的睡眠XD)

+3

使用'Data :: Dumper'打印出你認爲應該是散列引用的變量的值,並查看它實際是什麼。 – Anonymous 2012-07-21 14:55:41

+1

您的'my%phsh =();'是每次通過循環時(重新)初始化該散列。 – Kenosis 2012-07-21 16:03:54

+0

噢謝謝@Kenosis,我甚至沒有注意到XD – Nonameghost 2012-07-21 21:53:20

回答

3

您需要查看JSON數據或轉儲解碼的數據以查看它需要什麼樣的表單。評論數據,例如頂層數組。

這是一些代碼,打印所有頂級評論的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"; 
} 
+0

啊,謝謝!該代碼工作得很好。該代碼完美地爲我提供了評論。但即使使用相同的想法,我也無法在json的頭部獲取發佈數據。你能告訴我這個語法嗎? (不管你得到答案,非常感謝你!) – Nonameghost 2012-07-21 21:50:31