2013-10-18 1 views
1

나는 json 형식의 정보로 인쇄하려하고 있습니다. 내가 가진 것을 보여 주면 모든 것을 더 잘 설명 할 수 있다고 생각합니다.펄에서 json을 인쇄하는 것이 잘못되었습니다

foreach ...{ 
    printer($versions); 
} 

sub printer 
    { 
    foreach ...{ 
     my $results = id_cards(); 

    my $toJsonResult = JSON::to_json($results); 
    print $toJsonResult; 
    } 
} 

sub id_cards 
{ 
    my $returnData = []; 
    for($x=1;$y < $vehicle->{'ROWS'};$x++) 
    { 
      my $data; 
      $data->{year} = $vehicle->{$x}->{'YEAR'}; #there is more $data->repetativeness but not important to get the point 
      push(@$returnData,$data); 

      $y++ 
    } 

return $returnData; 
} 

인쇄 된 JSON :

[{"year":"2004"},{"year":"2004"}][{"year":"2002"},{"year":"2000"},{"year":"1994"}][{"year":"2004"},{"year":"1955"}][{"year":"2004"},{"year":"1955"}] 

이 내가 원하는 것과 매우 가까이 있지만, "객체"json으로 전혀 분리가 없다? (용어가 무엇인지는 확실하지 않지만) json이 유효하지는 않습니다. 이에 따라 그룹화 된 연도를 올바른 json으로 묶으려면 어떻게해야합니까?

+0

어디에'$ data'가 선언 되었습니까? 전역 변수 인 경우 모든 루프에서 값을 유지합니다. – TLP

+0

@TLP id_cards의 for 루프 내 코드에 추가했습니다. – BluGeni

답변

1

당신은 이미 id_cards 하위의 오른쪽 생각이 :

sub some_function { 
    my $return_array = []; 
    foreach (...) { 
     push(@$return_array, $some_result); 
    } 
    return $return_array; 
} 

를 수행 printer에서 같은 일 : 가장 바깥 쪽 foreach에서 다음

sub printer { 
    my $return_array = []; 
    # for ... 
    return $return_array; 
} 

파일의 맨 위에 동일하게 :

my $results = []; 
foreach (...) { 
    push(@$results,printer($versions)); 
} 
print JSON.to_json($results); 

마지막 순간에 한 번만 인쇄하십시오. JSON은 완전한 형식의 데이터 구조를 기대합니다. 모든 것을 제공하지 않으면 제대로 형식을 지정하는 방법을 알기를 기대할 수 없습니다.

물론이 시점에서 함수 printer은 아무 것도 인쇄하지 않습니다. 그래서 그것은 잘못 명명되었습니다. 나는 그 이름을 card_collection 또는 뭔가로 바꿀 것이다.

2

JSON 텍스트를 반복하여 인쇄하고 있습니다. 루프를 돌 때마다 새 JSON 텍스트를 인쇄합니다.

루프에서 데이터 구조를 빌드 한 다음 나중에 모든 것을 JSON으로 변환해야합니다.

당신은 효과적으로 다음을 수행하고

sub printer { 
    my @data; 
    foreach ...{ 
     push(@data, id_cards()); 
    } 
    print JSON::to_json(\@data); 
} 
+0

맞습니다. 변경을했지만 많이 변경되지 않았습니다. 그것은 내 arrayref 또는 hashref 내가 알고있는 뭔가 새로운 것, 새로운 것으로 보인다. 이제 제안 된 코드로'[{ "year": "2004"}, { "year": "2004"}]] [{ "year": "2002"}, { "year" "2000"}, { "year": "1994"}]] [[{ "year": "2004"}, { "year": "1955"}]] [[{ "year": "2004"} , { "year": "1955"}]]'무엇을해야할까요? – BluGeni

+0

그러면'printer'를 여러 번 호출합니다. 그래서 당신도 똑같은 문제를 상상해보십시오. – ikegami

+0

@ ikegami 와우 개봉 된. 좋아요. 코드를 입력했는데 필요한 것을 반환하는 방법을 잘 모르겠습니다. 프린터에서 제공하는 프린터에서 json을 인쇄 할 수 있습니다.제공 할 수있는 도움에 감사드립니다. 나는 이것에 영원히 걸렸다! – BluGeni

0

:

각 결과에 대한 새로운 JSON 문서를 생성하고, STDOUT에 모두 함께 걸립니다
my $result = [ { year => 2002 }, { year => 2003 } ]; 
my $toJsonResult = JSON::to_json($results); 
print $toJsonResult; # [{"year":"2002"},{"year":2003"}] 

my $result = [ { year => 2004 }, { year => 2005 } ]; 
my $toJsonResult = JSON::to_json($results); 
print $toJsonResult; # [{"year":"2004"},{"year":2005"}] 

my $result = [ { year => 2006 }, { year => 2007 } ]; 
my $toJsonResult = JSON::to_json($results); 
print $toJsonResult; # [{"year":"2006"},{"year":2007"}] 

.

모든 결과의 배열 인 하나의 문서를 만들고 싶으므로 모두 결과를 배열에 배치해야합니다.

my @results 

my $result = [ { year => 2002 }, { year => 2003 } ]; 
push $results, $result; 

my $result = [ { year => 2004 }, { year => 2005 } ]; 
push $results, $result; 

my $result = [ { year => 2006 }, { year => 2007 } ]; 
push $results, $result; 

my $toJsonResult = JSON::to_json(\@results); 
print $toJsonResult; # [[{"year":"2002"},{"year":"2003"}], 
         # [{"year":"2004"},{"year":"2005"}], 
         # [{"year":"2006"},{"year":"2007"}]] 
+0

내 코드가 업데이트되었습니다. 프린터에서 그룹을 반환하고 모든 것을 인쇄 할 수 있습니까? – BluGeni

+0

'JSON :: to_json'을 한 번만 호출하기를 원하기 때문에'printer' 루프 바깥에 있어야합니다. 배열에 넣고 배열을 구성한 값을 반환해야합니다. – ikegami

관련 문제