2012-07-21 4 views
1

저는 JSON 모듈을 사용하여 reddit의 JSON을 구문 분석하는 펄 스크립트를 만들고 있습니다.Reddit의 JSON 구문 분석 문제

그러나 나는 perl과 json 모두에게 매우 새로운 문제가 있습니다.

앞 페이지와 하위 태그를 성공적으로 구문 분석 할 수 있지만 주석의 구조가 다르므로 필요한 데이터에 액세스하는 방법을 알 수 없습니다. 이 성공적으로 난의 JSON에 갈 때 나는 http://www.reddit.com/.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.... 

: 여기

성공적으로 "데이터"해시 첫 페이지 및 subreddits를 발견 코드입니다 덧글 this one for example, 그것은 다른 형식을 가지고 있으며 그것을 구문 분석하는 방법을 알아낼 수 없습니다. 파서가 충돌하기 전에 같은 일을 시도하면 HASH 참조가 아니라고 말합니다.

내 질문은 : 어떻게 두 번째 JSON에서 "어린이"에 액세스합니까? 게시물에 대한 데이터와 의견에 대한 데이터를 모두 얻어야합니다. 아무도 도와 줄 수 있니?

미리 감사드립니다. (분명 할 수도 있지만 XD는 거의 작동하지 않습니다.)

+3

'Data :: Dumper'를 사용하여 해시 참조가되어야한다고 생각되는 변수의 값을 출력하고 실제로 그것이 무엇인지 확인하십시오. – Anonymous

+1

당신의'my % phsh =();'는 매회 루프를 통해 해시를 초기화하고 있습니다. – Kenosis

+0

오 감사합니다 @ 케노스, 나는 심지어 XD를 알지도 않았다 – Nonameghost

답변

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