2013-04-23 12 views
6

Belirli bir kullanıcıyla ilişkili haritaları listeleyen ancak iç içe geçmiş JSON nesneleriyle çalışmayan bir JSON nesnesi oluşturmaya çalışıyorum. Bu perl kodu ileJSl biçimlendirme perl

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

Ama alıyorum çıktı edilir: Bu Benim istediğim Yani

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

benim JavaScript işlemek zaman, data.maps [x] .id tanımlanmamış. Çıktılan JSON'un hatalı biçimlendirildiğinden eminim.

Düzeltmek için bana yardımcı olan var mı?

cevap

10

undefined, data.maps[x] adresinde sahip olduğunuz bir nesne değil, bir dize. Bir dizenin id adı verilen bir özelliği olmadığından, undefined elde edersiniz. (Ben Perl değişmez eğer) muhtemelen böyle bir şey yapmak istiyorum:

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

Ama yapacak daha iyi şey, bir dize olarak kodlamak olmadığından emin olmak için, ancak uygun JSON olarak.

sizin perl bu bölümü:

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

basitçe tüm bu verilerin dışında bir alıntı dize mı yapıyor. Bunun yerine, istediğiniz şey bir JSON haritası/ilişkilendirici dizisine dönüştürülebilen gerçek bir perl hash'idir. Yani bu deneyin:

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

aslında doğru JSON çevrilmiş alacak bir perl karma (yerine sadece dize) sahip bu şekilde. Bunu çalıştırdığınızda

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; 

elde edersiniz::

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

ben fark dize kendim sorunu Örnek olarak

, bazı test kodu yazmış! Teşekkürler, perl betiğini değiştirdim ve şimdi güzel çalışıyor! – skeniver

+1

[Perl 5.14] 'den önce (http://perldoc.perl.org/perl5140delta.html#Syntactical-Enhancements "perldoc perldelta5140") "$ map itin," 'push @ olarak yazılmalıdır. $ haritalar, ... '. –