Ankündigung

Einklappen
Keine Ankündigung bisher.

Objekt aus Jsonfile auslesen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Objekt aus Jsonfile auslesen

    Ich habe ein Programm mit PHP OOP geschrieben, indem man Filme und Säle eingeben kann und welche dann in einem Json-File gespeichert werden. Wie kann ich nun das Objekt aus dem Json-File auslesen und wieder als Objekt verwenden?
    Da ich noch Schüler bin, würde mich eine einfache Erklärung sehr freuen.
    Das Json-File sieht so aus.
    [ { "filmname": "Avatar", "starttime": "20.15", "endtime": "23.00", "room": "1", "seats": [ "A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9", "A10", "B1", "B2", "B3", "B4", "B5", "B6", "B7", "B8", "B9", "B10", "C1", "C2", "C3", "C4", "C5", "C6", "C7", "C8", "C9", "C10", "D1", "D2", "D3", "D4", "D5", "D6", "D7", "D8", "D9", "D10", "E1", "E2", "E3", "E4", "E5", "E6", "E7", "E8", "E9", "E10" ] }, { "filmname": "Star Wars", "starttime": "17.00", "endtime": "19.00", "room": "1", "seats": [ "A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9", "A10", "B1", "B2", "B3", "B4", "B5", "B6", "B7", "B8", "B9", "B10", "C1", "C2", "C3", "C4", "C5", "C6", "C7", "C8", "C9", "C10", "D1", "D2", "D3", "D4", "D5", "D6", "D7", "D8", "D9", "D10", "E1", "E2", "E3", "E4", "E5", "E6", "E7", "E8", "E9", "E10" ] } ]

  • #2
    Code:
    /* ggf. $myJSON = file_get_contents("my.json")
    $decodedJSON = json_decode ($myJSON);
    echo $decodedJSON[0]->filmname.'<br>';
    echo $decodedJSON[0]->starttime.'<br>';
    echo $decodedJSON[0]->seats[0];

    Kommentar


    • #3
      Moin Groner04 und willkommen!
      Das was du da machen möchtest nennt sich "Serialisieren". Wenn du aus einem JSON (-String) wieder ein Object erstellen möchtest, dann musst du dafür einen Serializer bauen. Diese gibt es schon fertig, beispielsweise hir von Symfony (https://symfony.com/doc/current/comp...erializer.html).
      Wenn du den Serializer zu lernzwecken selbst erstellen möchtest, dann legst du eine neue Klasse an, die den JSON-String annimmt und als erstes, wie von kaminbausatz gezeigt, das JSON in ein Array verwandelt. Danach initialisierst du deine Objekte (Movies, Theaters etc.) und weist den die entsprechenden Werte zu. Am Ende hast du dann dein fertiges Object.
      Lass uns wissen, ob dir das schon etwas gebracht hat!

      PS: Guck dir bitte diesen Thread (https://www.php.de/forum/webentwickl...rf-hier-posten) an und eröffne dein nächstes Thema bitte im Forum für Einsteiger.
      Webseite: https://thomasd.codes | YouTube: https://www.youtube.com/channel/UCOFvlFFKeZjhnMn5sHQi8XA

      Kommentar


      • #4
        Zitat von thomasd.codes Beitrag anzeigen
        Moin [USER="48219"]
        Das was du da machen möchtest nennt sich "Serialisieren". Wenn du aus einem JSON (-String) wieder ein Object erstellen möchtest, dann musst du dafür einen Serializer bauen. Diese gibt es schon fertig, beispielsweise hir von Symfony (https://symfony.com/doc/current/comp...erializer.html).
        Wenn du den Serializer zu lernzwecken selbst erstellen möchtest, dann legst du eine neue Klasse an, die den JSON-String annimmt und als erstes, wie von kaminbausatz gezeigt, das JSON in ein Array verwandelt. Danach initialisierst du deine Objekte (Movies, Theaters etc.) und weist den die entsprechenden Werte zu. Am Ende hast du dann dein fertiges Object.

        Serialisierung wäre der Schritt von Objekt in eine Speicherrepräsentation. Deserialisierung ist hier das gesuchte.

        "Software is like Sex, it's best if it's free." - Linus Torvalds

        Kommentar


        • #5
          thomasd.codes
          Kann es sein, dass Alf2016 wieder aufgetaucht ist??

          Kommentar


          • #6
            Moin JaMa !
            Selbstverständlich hast du recht. Ich habe im Eifer des Gefechts die Pfeile verwechselt.
            Vielen Dank für Deinen Hinweis.

            Kann es sein, dass Alf2016 wieder aufgetaucht ist??
            Leider nein, der bin ich nicht. Tut mir leid. Oder vielleicht hattest du ja auch Angst, dass er wieder da ist. Dann kannst du beruhigt sein.
            Webseite: https://thomasd.codes | YouTube: https://www.youtube.com/channel/UCOFvlFFKeZjhnMn5sHQi8XA

            Kommentar


            • #7
              Mal abwarten, bisher zeigen Deine Beitrage ähnliche Muster...Angst, nein, nur dass mir der Himmel auf den Kopf fällt.

              Kommentar


              • #8
                kaminbausatz Kannst du mir bitte etwas genauer erläutern was du genau meinst?
                Webseite: https://thomasd.codes | YouTube: https://www.youtube.com/channel/UCOFvlFFKeZjhnMn5sHQi8XA

                Kommentar


                • #9
                  Es gibt ja in PHP auch das Serializable Interface, womit man super Objekte hin und her wandeln kann.

                  Hier mal ein Beispiel:
                  PHP-Code:
                  <?php
                  class Foo implements \Serializable
                  {
                      private 
                  $a 1;
                      private 
                  $b 2;

                       
                  /**
                       * String representation of object
                       *
                       * @return string
                       */
                      
                  public function serialize()
                      {
                          return 
                  json_encode([
                              
                  'a' => $this->a,
                              
                  'b' => $this->b,            
                          ]);
                      }

                      
                  /**
                       * Constructs the object
                       *
                       * @param string $serialized
                       * @return void
                       */
                      
                  public function unserialize($serialized)
                      {
                          
                  $json json_decode($serializedtrue);

                          
                  $this->$json['a'];
                          
                  $this->$json['b'];                
                      }  
                  }


                  $test = new Foo();
                  $json serialize($test);

                  echo 
                  '<pre>';
                  echo 
                  'JSON:' $json;

                  $test1 unserialize($json);

                  echo 
                  '<br>';
                  var_dump($test1);

                  ?>
                  Output:
                  Code:
                  JSON:C:3:"Foo":13:{{"a":1,"b":2}}
                  
                  object(Foo)#2 (2) {
                    ["a":"Foo":private]=>
                    int(1)
                    ["b":"Foo":private]=>
                    int(2)
                  }

                  Kommentar


                  • #10
                    Nur ist das kein JSON, was da erzeugt wird.

                    Kommentar


                    • #11
                      Korrekt, aber wenn es vorher Objekte waren und hinterher wieder Objekte werden sollen ist dies der korrekte bzw. einfachste Weg.

                      Wie kann ich nun das Objekt aus dem Json-File auslesen und wieder als Objekt verwenden?

                      Kommentar


                      • #12
                        Wenn ein Objekt in JSON als solches deklariert ist, bleibt es auch nach json_decode ein Objekt.
                        Wenn aber, wie im Beispiel, ein Array mit 2 Objekten und "seats" als weiteres Array deklariert wird, kann es eben kein Objekt sein.

                        folgendes ist nach json_decode ein Objekt:

                        Code:
                        { "BMW":
                          { "dreier":
                            {
                             "Leistung": "150 kW"
                            },
                            "fünfer":
                            {
                             "Leistung": "180 kW"
                            }
                          },
                          "Audi":
                          { "vierer":
                            {
                            "Leistung": "130 kW"
                            }
                          }
                        }

                        Kommentar


                        • #13
                          Ich verstehe den Einwand nicht ganz genau. Vll. kannst du es noch mal etwas ausführen?

                          Natürlich ist es dann kein reines JSON mehr aber wenn man den Zustand eines PHP Objektes persistieren möchte, so wie der TE, macht es doch Sinn die entsprechenden Funktionen von PHP zu nutzten, anstatt die Objekte wieder per Hand zusammen zu bauen oder mit anonymen Klassen / Datenstrukturen zu hantieren..

                          Generell funktioniert das was ich gezeigt habe auch mit einer Collection / Array von Objekten:
                          PHP-Code:
                          <?php

                          class Film implements \Serializable
                          {
                              public 
                          $filmname;
                              public 
                          $starttime '20.15';
                              public 
                          $endtime '23.00';
                              public 
                          $room 1;
                              public 
                          $seats = ['A1''A2'];

                              public function 
                          __construct(string $filmname) {
                                  
                          $this->filmname $filmname;
                              }

                              public function 
                          serialize() {
                                  return 
                          json_encode([
                                      
                          'filmname' => $this->filmname,
                                      
                          'starttime' => $this->starttime,
                                      
                          'endtime' => $this->endtime,
                                      
                          'room' => $this->room,
                                      
                          'seats' => $this->seats,
                                  ]);
                              }

                              public function 
                          unserialize($serialized) {
                                  
                          $json json_decode($serializedtrue);

                                  
                          $this->filmname $json['filmname'];
                                  
                          $this->starttime $json['starttime'];
                                  
                          $this->endtime $json['endtime'];
                                  
                          $this->room $json['room'];
                                  
                          $this->seats $json['seats'];
                              }  

                          }

                          $array = [
                              new 
                          Film('Test1'),
                              new 
                          Film('Test2'),
                          ];

                          $t1 serialize($array);

                          echo 
                          '<pre>';
                          echo 
                          $t1;
                          echo 
                          '<br>';
                          var_dump(unserialize($t1));
                          Code:
                          a:2:{i:0;C:4:"Film":87:{{"filmname":"Test1","starttime":"20.15","endtime":"23.00","room":1,"seats":["A1","A2"]}}i:1;C:4:"Film":87:{{"filmname":"Test2","starttime":"20.15","endtime":"23.00","room":1,"seats":["A1","A2"]}}}
                          array(2) {
                            [0]=>
                            object(Film)#3 (5) {
                              ["filmname"]=>
                              string(5) "Test1"
                              ["starttime"]=>
                              string(5) "20.15"
                              ["endtime"]=>
                              string(5) "23.00"
                              ["room"]=>
                              int(1)
                              ["seats"]=>
                              array(2) {
                                [0]=>
                                string(2) "A1"
                                [1]=>
                                string(2) "A2"
                              }
                            }
                            [1]=>
                            object(Film)#4 (5) {
                              ["filmname"]=>
                              string(5) "Test2"
                              ["starttime"]=>
                              string(5) "20.15"
                              ["endtime"]=>
                              string(5) "23.00"
                              ["room"]=>
                              int(1)
                              ["seats"]=>
                              array(2) {
                                [0]=>
                                string(2) "A1"
                                [1]=>
                                string(2) "A2"
                              }
                            }
                          }

                          Kommentar


                          • #14
                            Man muss 2 Fälle unterscheiden:

                            1. Arrays und stdClass-Objekte speichern + wiederherstellen
                            Das Problem vom TE. Hier reicht json_encode() und json_decode() aus.

                            2. allgemein Objekte von Klassen speichern und wiederherstellen
                            Hier muss zu serialize() und unserialize() gegriffen werden.
                            Die Implementierung vom Serializable-Interface ist dafür nicht notwendig, kann aber nützlich sein.
                            Ist nicht das Thema vom TE. Bin da ganz bei kaminbausatz .
                            Wenn das Thema Serializable-Interface von Interesse ist empfehle ich einen neuen Thread aufzumachen.

                            Kommentar


                            • #15
                              Naja der TE schreibt er hat eine Anwendung (OOP) geschrieben. Sprich er arbeitet komplett mit Objekten. Diese möchte er Speichern und wiederherstellen. Das er sie jetzt als JSON Speichert ist eine Design-Entscheidung wozu ich eine bessere Lösung gezeigt habe. Wenn er die Daten als JSON woanders herbekommt, dann macht natürlich ein eigener Serializer mehr Sinn oder die arbeit direkt low-level mit stdClass oder nem Array.

                              Kommentar

                              Lädt...
                              X