2013-04-23 4 views
6

특정 사용자와 연결된지도를 나열하지만 중첩 된 JSON 객체로 작업 한 적이없는 JSON 객체를 만들려고합니다. 이 펄 코드Perl에서 JSON 형식 지정

{ 
    "success":"list of users maps", 
    "maps":[ 
     { 
     "id":"1", 
     "name":"Home to LE", 
     "date_created":"1366559121" 
     }, 
     { 
     "id":"2", 
     "name":"Test 1", 
     "date_created":"1366735066" 
     } 
    ] 
} 

:

my $maps = []; 
    for (my $x = 0; $x < $sth->rows; $x++) { 
    my ($id, $name, $date) = $sth->fetchrow_array(); 
    my $map = qq{{"id":"$id","name":"$name","date_created":"$date"}}; 
    push $maps, $map; 
    } 
    my $j = JSON::XS->new->utf8; 
    my $output = $j->encode({ 
    "success"=>"list of users maps", 
    "maps"=>$maps 
    }); 

하지만 무엇입니까 출력됩니다 : 이것은 내가 원하는 것입니다 그래서

{ 
    "success":"list of users maps", 
    "maps":[ 
     "{\"id\":\"1\",\"name\":\"Home to LE\",\"date_created\":\"1366559121\"}", 
     "{\"id\":\"2\",\"name\":\"Test 1\",\"date_created\":\"1366735066\"}" 
    ] 
} 

내 자바 스크립트를 처리 할 때 data.maps [x] .id는 정의되지 않았습니다. 나는 출력되는 JSON의 형식이 틀림 없다고 확신한다.

누구든지 해결하도록 도와 줄 수 있습니까?

답변

10

에있는 항목은 문자열이 아니기 때문에 undefined입니다. 문자열에는 id이라는 속성이 없으므로 undefined이 표시됩니다. (필자는 펄 스크립트를 변경할 수없는 경우) 아마 같은 것을 할 것 :

var mapData = JSON.parse(data.maps[x]); 
//do stuff with mapData.id 

그러나 할 수있는 더 좋은 것은, 그것이 문자열로 인코딩하지 않습니다 있는지 확인하는 것입니다 만, 적절한 JSON으로.

당신의 펄 스크립트에서이 부분 :

my $map = qq{{"id":"$id","name":"$name","date_created":"$date"}}; 

은 단순히 모든 데이터에서 인용 된 문자열을하고있다. 대신 JSON map/associative-array로 변환 할 수있는 실제 perl 해시를 원합니다. 따라서 이것을 시도하십시오 :

my $map = { 
    "id" => "$id", 
    "name" => "$name", 
    "date_created" => "$date" 
}; 
push $maps, $map; 

이 방식으로 실제로 JSON으로 변환되는 펄 해시 (단지 문자열 대신)가 있습니다. 당신이 이것을 실행하면

use strict; 
use JSON::XS; 

my $maps = []; 
push $maps, { id => 1, blah => 2 }; 
push $maps, { id => 3, blah => 2 }; 

my $j = JSON::XS->new->utf8->pretty(1); 
my $output = $j->encode({ 
    success => "list of blah", 
    maps => $maps 
}); 

print $output; 

, 당신이 얻을 :

{ 
    "success" : "list of blah", 
    "maps" : [ 
     { 
     "blah" : 2, 
     "id" : 1 
     }, 
     { 
     "blah" : 2, 
     "id" : 3 
     } 
    ] 
} 
+1

내가 실현해야 문자열 자신을 발급 예를 들어

, 나는 몇 가지 테스트 코드를 작성! 고마워, 난 펄 스크립트를 변경했습니다 그리고 지금 아름답게 작동합니다! – skeniver

+1

[Perl 5.14] (http://perldoc.perl.org/perl5140delta.html#Syntactical-Enhancements "perldoc perldelta5140")에 앞서'push $ maps, ... '는'push @ $ maps, ...'. –