2012-04-09 6 views
0

Ich versuche, einige Daten von Perl zu JSON auszugeben. Ich kann eine einfache Ausgabe machen, möchte sie aber besser strukturieren.Perl zu JSON, mit Schlüssel/Wert-Paaren

Ich habe ein Array mit einer ID, einer Startzeit und einer Endzeit. Dies ist der Code, den ich ausgeben bin mit:

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

Welche zurück:

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

Aber ich möchte wie die Ausgabe etwas mehr:

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

jemand helfen kann, wie man meine Ausgabe besser strukturieren?

--- UPDATE ------

Dank Michael. Ich habe versucht, dein Beispiel zu implementieren.

Dies ist der Code zur Zeit:

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

Aber es gibt den Fehler (bezogen auf die foreach Linie):

Not a HASH reference at line 148 

$ Jahreszeit ist eine ArrayRef Rückkehr von einem SQL fetchall_arrayref

Irgendwelche Hinweise?

+0

Sind CPAN-Bibliotheken verwenden Sie in der Lage, wie http://search.cpan.org/~mlehmann/JSON-XS-2.32/XS.pm? – dsolimano

+2

Der von Ihnen zurückgegebene Code ist ungültig JSON. Sollte diese "0" wirklich da sein? – Quentin

+1

Wenn Sie einen Hash in JSON möchten, muss dieser Teil der Struktur ein Hash in der Perl-Struktur sein. –

Antwort

2

Sie möchten im Grunde ein Array von Arrays in ein Array von Hashes konvertieren, und Sie können dies mit map tun. Unter der Annahme, $data ist Ihre Struktur, dies sollte es tun:

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

Hey Michael, kannst du bitte meinen aktualisierten Code überprüfen und mich wissen lassen, was ich falsch mache? – skeniver

2

Wenn Sie ein Array von Objekten mit Schlüssel/Wert-Paaren anstelle eines Arrays von Arrays ausgeben möchten, dann geben Sie zuerst die entsprechenden Daten in to_json ein.

, d. H. Ein Array von HashRefs und kein Array von ArrayRefs.

Sie können use map to transform the data.

2

Wenn Sie so etwas versuchen, überprüfen Sie immer CPAN, um zu sehen, ob es jemand vorher getan hat, und versuchen Sie nicht, das Rad neu zu erfinden. Ich habe ein Modul namens JSON gefunden, das genau das zu tun scheint, was Sie wollen.

Es gibt ein Beispiel auf dieser Seite, das genau das tut, was Sie wollen. Hier ist eine kurze Umschreibung:

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; 

Kann nicht einfacher als das. Der beste Teil ist, dass dies funktioniert, egal wie komplex Ihre Array-Struktur wird.

+0

Anscheinend verwendet der Fragesteller bereits das JSON-Modul. Es gibt einen Aufruf an 'to_json' im Code. –