2013-04-23 6 views
6

Ich versuche ein JSON-Objekt zu erstellen, das Zuordnungen zu einem bestimmten Benutzer auflistet, aber noch nie mit verschachtelten JSON-Objekten gearbeitet hat. Das ist, was ich will:JSON-Formatierung in Perl

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

mit diesem Perl-Code:

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

Aber der Ausgang Ich erhalte ist:

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

Also, wenn ich es in meinem Javascript verarbeiten, die data.maps [x] .id ist nicht definiert. Ich bin ziemlich sicher, dass das ausgegebene JSON falsch formatiert ist.

Kann mir jemand helfen, es zu reparieren?

Antwort

10

Es ist undefined, denn was Sie bei data.maps[x] haben, ist kein Objekt, sondern eine Zeichenfolge. Da eine Zeichenfolge keine Eigenschaft namens id hat, erhalten Sie undefined. Ich würde wahrscheinlich etwas tun (wenn ich nicht den Perl-Skript ändern könnte):

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

Aber die bessere Sache zu tun ist, um sicherzustellen, dass es nicht als String nicht codiert, aber als richtiges JSON.

Dieser in Ihrem Perl-Skript Teil:

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

einfach ist alles eine Zeichenfolge in Anführungszeichen zu machen, dass Daten aus. Stattdessen möchten Sie einen tatsächlichen Perl-Hash erhalten, der in eine JSON-Map/ein assoziatives Array übersetzt werden kann. Also versuchen Sie dies:

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

So kann man tatsächlich ein Perl-Hash haben (statt nur einen String), die in die richtige JSON übersetzt wird erhalten.

Als Beispiel schrieb ich einige Testcode:

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; 

Wenn Sie dies ausführen, erhalten Sie:

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

ich die Zeichenfolge ausgeben mich erkannt haben sollte! Danke, ich habe das Perl-Skript geändert und es funktioniert jetzt wunderbar! – skeniver

+1

Beachten Sie, dass vor [Perl 5.14] (http://perldoc.perl.org/perl5140delta.html#Syntax-Enhancements "perldoc perldelta5140") 'push $ maps, ...' als 'push @ geschrieben werden müsste. $ Karten, ... '. –