Perl-Hash nach JSON
basti123
- perl
Hallo!
Ich möchte ein Perl-Hash ins JSON-Format kodieren.
Der Hash befülle ich aus einer DB-Abfrage wie folgt:
while (($id, $author, $title) = $dbh->fetchrow_array()) {
$hash{$id} = [$author, $title];
}
wenn ich dann ein
use JSON;
print encode_json \%hash;
ausführe, wird mir nichts auf dem Bildschirm ausgegeben.
Was mache ich/ verstehe ich falsch?
Danke,
Basti
Ich haette gern soetwas zurück:
"1": [ {
"author": "author1",
"title": "title1"
}],
"2": [ {
"author": "author2",
"title": "title2"
}],
"3": [ {
"author": "author3",
"title": "title3"
}]
Geht das?
Danke,
basti
Moin Moin!
Ich haette gern soetwas zurück:
"1": [ {
"author": "author1",
"title": "title1"
}],
"2": [ {
"author": "author2",
"title": "title2"
}],
"3": [ {
"author": "author3",
"title": "title3"
}]
>
>
> Geht das?
Das entspricht nicht der Perl-Struktur.
Alexander
--
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
Moin Moin!
Ich haette gern soetwas zurück:
"1": [ {
"author": "author1",
"title": "title1"
}],
"2": [ {
"author": "author2",
"title": "title2"
}],
"3": [ {
"author": "author3",
"title": "title3"
}]
> >
> >
> > Geht das?
>
> Das entspricht nicht der Perl-Struktur.
Müsste ich dann innerhalb des normalen Arrays noch ein Hash-Array aufbauen, damit ich das obige Resultat erhalte?
Also sowas wie
~~~perl
while (($id, $author, $title) = $dbh->fetchrow_array()) {
$hash{$id} = [$authorHash{'author'} => $author, $titleHash{'title'} => $title];
}
~~~danke,
Basti
Moin Moin!
Das entspricht nicht der Perl-Struktur.
Müsste ich dann innerhalb des normalen Arrays noch ein Hash-Array aufbauen, damit ich das obige Resultat erhalte?Also sowas wie
while (($id, $author, $title) = $dbh->fetchrow_array()) {
$hash{$id} = [$authorHash{'author'} => $author, $titleHash{'title'} => $title];
}
Was spricht dagegen, es auszuprobieren?
Das JSON-Modul liefert (für einfache Scalare, Arrays und Hashes) eine der Perl-Datenstruktur identische JSON-Struktur aus. Wenn Du ein Array von Arrays in JSON haben willst, mußt Du das auch in Perl haben. Wenn Du ein Array von Hashes ("Objekte" in JSON-Benennung) haben willst, dann mußt Du das auch in Perl haben. Und so weiter.
JSON nutzt praktischerweise bis auf den Doppelpunkt die selben Interpunktionszeichen, die Du auch in Perl nutzen kannst. Wenn Du in JSON also
~~~javascript
{
"key1" : [
{
"subkey1" : "value1",
"subkey2" : "value2"
}
],
"key2" : [
{
"subkey3" : "value3",
"subkey4" : "value4"
}
]
}
haben willst, brauchst Du in Perl
{
"key1" => [
{
"subkey1" => "value1",
"subkey2" => "value2"
}
],
"key2" => [
{
"subkey3" => "value3",
"subkey4" => "value4"
}
]
}
Wobei ich nicht verstehe, wozu Du die Hashes noch einmal in Arrays verpacken willst. Wenn Du für jeden Key auf der obersten Ebene nur einen Hash hast, brauchst Du kein Array drum herum zu packen:
{
"key1" => {
"subkey1" => "value1",
"subkey2" => "value2"
},
"key2" => {
"subkey3" => "value3",
"subkey4" => "value4"
}
}
Du willst ganz dringend perldsc lesen und Data::Dumper benutzen lernen.
Alexander
Ok, vielen Dank euch allen. Schaue ich mir an.
Was ich brauche, ist eigentlich diese XML-Struktur in JSON, weil das dann für eine Android-Programmierung gebraucht wird:
<books>
<book id="1">
<author>author1</author>
<title>title1</title>
</book>
<book id="2">
<author>author2</author>
<title>title2</title>
</book>
</books>
...
In der Daetenbank ist es einfach zeilenweise abgelegt:
1 | author1 | title1
2 | author2 | title2
...
und ich denke mir, dass dies dann in JSON so aussehen müsse:
id: 1
author: "author1"
title: "title1",
id:2
author: "author2"
title: "title2",
...
Grüße,
Basti
Moin Moin!
Ok, vielen Dank euch allen. Schaue ich mir an.
Was ich brauche, ist eigentlich diese XML-Struktur in JSON, weil das dann für eine Android-Programmierung gebraucht wird:
Und Android kann nicht mit XML umgehen? Wunder über Wunder ...
<books>
<book id="1">
<author>author1</author>
<title>title1</title>
</book>
<book id="2">
<author>author2</author>
<title>title2</title>
</book>
</books>
...
>
>
> In der Daetenbank ist es einfach zeilenweise abgelegt:
> 1 | author1 | title1
> 2 | author2 | title2
> ...
>
> und ich denke mir, dass dies dann in JSON so aussehen müsse:
>
> id: 1
> author: "author1"
> title: "title1",
> id:2
> author: "author2"
> title: "title2",
> ...
Das ist kein JSON, höchstens vielleicht [YAML](http://de.wikipedia.org/wiki/YAML).
Das ist JSON:
~~~javascript
[
{
"id":1,
"author":"author1",
"title":"title1"
},
{
"id":2,
"author":"author2",
"title":"title2"
}
]
Das auch:
{
1 : {
"author":"author1",
"title":"title1"
},
2 : {
"author":"author2",
"title":"title2"
}
}
Such Dir aus, was dem Client besser paßt.
Alexander
Hi,
"1": [ {
"author": "author1",
"title": "title1"
}],
"2": [ {
"author": "author2",
"title": "title2"
}],
"3": [ {
"author": "author3",
"title": "title3"
}]
Kann es zu einer ID denn mehrere Titel geben? Wenn nein: wozu der Array?
> Müsste ich dann innerhalb des normalen Arrays noch ein Hash-Array aufbauen, damit ich das obige Resultat erhalte?
>
> Also sowas wie
>
> ~~~perl
> while (($id, $author, $title) = $dbh->fetchrow_array()) {
> $hash{$id} = [$authorHash{'author'} => $author, $titleHash{'title'} => $title];
> }
>
Dein äußeres Objekt ist ein Hash mit dem Feld ID als Schlüssel, das stimmt soweit.
Dem weist du ein Array zu. Deine obige JSON-Struktur zeigt, dass du innerhalb des Arrays einen Hash haben willst. Also müsstest du
[ {$authorHash{'author'} => $author, $titleHash{'title'} => $title} ]
zuweisen. Allerdings erlaubst du damit nicht, dass zu einer ID mehrere Einträge existieren können. Wenn es fachlich nicht sinnvoll ist, dann entferne einfach die Array-Klammern (dann ist einer ID genau ein Eintrag zugeordnet.
Wenn es vorkommen kann, dass einer ID mehrere Einträge zugeordnet werden können, dann musst du prüfen, ob $hash{$id} schon existiert. Wenn nicht, legst du es wie von mir gezeigt an, ansonsten pusht du deinen author/title-Hash in den Array rein.
Bis die Tage,
Matti
Moin!
wenn ich dann ein
use JSON;
print encode_json %hash;
>
> ausführe, wird mir nichts auf dem Bildschirm ausgegeben.
>
> Was mache ich/ verstehe ich falsch?
falsche Funktion?
~~~perl
#! /bin/perl
$hash{'t1'}='T1';
$hash{'t2'}='T2';
$var='%hash';
use JSON;
print to_json(\%hash);
-> {"t2":"T2","t1":"T1"}
Danke,
Bitte.
Fred
Moin Moin!
Hallo!
Ich möchte ein Perl-Hash ins JSON-Format kodieren.
Der Hash befülle ich aus einer DB-Abfrage wie folgt:
while (($id, $author, $title) = $dbh->fetchrow_array()) {
$hash{$id} = [$author, $title];
}
>
> wenn ich dann ein
>
> ~~~perl
> use JSON;
> print encode_json \%hash;
>
ausführe, wird mir nichts auf dem Bildschirm ausgegeben.
Kann ich nicht nachvollziehen:
#!/usr/bin/perl
use strict;
use warnings;
use JSON;
my %hash=(
42 => [ "Hein Meier", "Liebesleben der Ameisen" ],
99 => [ "Karl Klein", "Grosses Lexikon" ],
321 => [ "Hugo E. Balder", "Eines Tages ..." ],
);
print encode_json \%hash;
liefert:
{"42":["Hein Meier","Liebesleben der Ameisen"],"99":["Karl Klein","Grosses Lexikon"],"321":["Hugo E. Balder","Eines Tages ..."]}
Alexander