basti123: Perl-Hash nach JSON

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

  1. 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

    1. 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".
      
      1. 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
        
        1. 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

          --
          Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
          1. 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

            1. 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

              --
              Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
        2. 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

  2. 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

  3. 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

    --
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".