2013-04-23 71 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" 
     } 
    ] 
} 

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

但我得到的输出:

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

所以,当我处理它在我的JavaScript中, data.maps [x] .id是未定义的。我很确定输出的JSON格式不正确。

任何人都可以帮我修复它吗?

回答

10

这是undefined,因为你在data.maps[x]不是一个对象,而是一个字符串。由于字符串没有名为id的属性,因此您得到undefined。我可能会做这样的事情(如果我不能改变perl脚本):

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

但更好的事情,就是确保它不编码它作为一个字符串,但作为适当的JSON。

这部分在你的perl脚本:

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

是简单地使带引号的字符串的所有数据的。相反,你想要的是一个实际的perl散列,可以转换成JSON映射/关联数组。所以,试试这个:

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

这样,你确实有一个Perl的散列(而不是只是一个字符串),将得到翻译成合适的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

我应该意识到字符串问题我自己!谢谢,我已经改变了pe​​rl脚本,现在它运行得非常漂亮! – skeniver 2013-04-23 17:43:11

+1

请注意,在[Perl 5.14]之前(http://perldoc.perl.org/perl5140delta.html#Syntactical-Enhancements“perldoc perldelta5140”)'push $ maps,...'必须写成'push @ $地图,...'。 – 2013-04-24 20:15:13