2012-04-09 79 views
0

我想輸出一些數據從Perl到JSON。我可以做一個簡單的輸出,但想更好地構造它。我有一個ID,開始時間和結束時間數組。這是我用來輸出的代碼:它返回Perl到JSON,與鍵/值對

print header('application/json'); 
my $json->{$entry} = \@array; 
my $json_text = to_json($json); 
print $json_text; 

{"Season":[["1","1330065300","1344038401"],["7","1298505601","1312416001"]]} 

但我想輸出更多的東西一樣:

{"Season":0[{"id":1,"DateStart":1330065300,"DateEnd":1344038401},{"id":7,"DateStart":1298505601,"DateEnd":1312416001}]} 

任何人都可以如何幫助更好的結構我的輸出?

--- UPDATE ------

謝謝邁克爾。我試圖實現你的例子。

這是目前的代碼:

foreach my $key (keys %$seasons) 
    { 
     $seasons->{$key} = 
     [ 
      map 
      { 
       { id=>$_[0], DateStart=>$_[1], DateEnd=>$_[2] } 
      } @{$seasons->{$key}} 
     ]; 
    } 

但它返回錯誤(指的foreach線):

Not a HASH reference at line 148 

$季節是從SQL fetchall_arrayref

一個數組引用返回

任何線索?

+0

您能夠使用CPAN庫,例如http://search.cpan.org/~mlehmann/JSON-XS-2.32/XS.pm? – dsolimano 2012-04-09 14:08:05

+2

你說你想返回的代碼是無效的JSON。那個'0'真的應該在那裏嗎? – Quentin 2012-04-09 14:16:20

+1

如果你想在JSON中使用散列,那麼該結構的那部分必須是Perl結構中的散列。 – 2012-04-09 23:56:29

回答

2

您基本上想要將數組數組轉換爲散列數組,並且您可以使用map執行此操作。假設$data是你的結構,這應該這樣做:

for my $key (keys %$data) { 
    $data->{$key} = [ 
     map { 
      { id => $_->[0], DateStart => $_->[1], DateEnd => $_->[2] } 
     } @{$data->{$key}} 
    ];  
} 
+0

嘿邁克爾,你能檢查我的更新代碼,讓我知道我做錯了什麼? – skeniver 2012-04-11 10:09:17

2

如果要輸出帶有鍵/值對而不是陣列數組的對象數組,則首先將適當的數據放入to_json

即一個hashrefs數組而不是一個arrayrefs數組。您可以use map to transform the data

2

每當你嘗試這樣的事情時,總是檢查CPAN,看看有人以前做過,而不是試圖重新發明輪子。我找到了一個名爲JSON的模塊,它看起來完全符合你的要求。

在該頁面上有一個示例,它完全符合您的需求。下面是一個簡單的釋義:

use JSON; # imports encode_json, decode_json, to_json and from_json. 

# simple and fast interfaces (expect/generate UTF-8) 
my $utf8_encoded_json_text = encode_json \@array; 

不能獲得比這更容易。最好的部分是,無論你的數組結構有多複雜,這都可以工作。

+0

顯然,提問者已經在使用JSON模塊。在代碼中調用'to_json'。 – 2012-04-09 21:00:37