2013-04-23 12 views
6

Próbuję utworzyć obiekt JSON zawierający listę map skojarzonych z konkretnym użytkownikiem, ale nigdy nie pracował z zagnieżdżonymi obiektami JSON. To jest to, co chcę:Formatowanie JSON w Perlu

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

z tego kodu perl:

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 
    }); 

ale wyjście otrzymuję jest:

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

Więc kiedy przetwarza je w moim językiem JavaScript, data.maps [x] .id jest niezdefiniowany. Jestem całkiem pewien, że wynik JSON jest niepoprawnie sformatowany.

Czy ktoś może mi pomóc to naprawić?

Odpowiedz

10

Jest to undefined, ponieważ to, co masz w data.maps[x] nie jest obiektem, ale ciągiem znaków. Ponieważ ciąg nie ma właściwości o nazwie id, otrzymujesz undefined. pewnie bym coś jak to zrobić (jeśli nie mogę zmienić skrypt perla):

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

Ale lepiej rzeczą do zrobienia jest, aby upewnić się, że nie zakodować go jako ciąg, ale jako właściwy JSON.

Ta część w skrypcie Perla:

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

jest po prostu dokonywania cudzysłowie z wszystkimi tymi danymi. Zamiast tego, czego chcesz, to rzeczywisty hash, który można przetłumaczyć na mapę JSON/tablicę asocjacyjną. Więc spróbuj tego:

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

ten sposób można rzeczywiście mieć hash Perla (zamiast tylko sznurku), które będą tłumaczone na właściwej JSON.

Jako przykład, pisałem jakiś kod testowy:

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; 

Po uruchomieniu tego dostaniesz:

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

Powinienem był realizowany ciąg wydawać się! Dzięki, zmieniłem skrypt Perla i teraz działa pięknie! – skeniver

+1

Pamiętaj, że przed [Perl 5.14] (http://perldoc.perl.org/perl5140delta.html#Syntactical-Enhancements "perldoc perldelta5140") 'push $ maps, ...' musiałby być napisany jako 'push @ $ mapy, ... '. –