2013-04-23 68 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