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

  • Groner04
    hat ein Thema erstellt Objekt aus Jsonfile auslesen.

    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" ] } ]

  • kaminbausatz
    antwortet
    nur als Bemerkung :

    Code:
    <?php
    class myClass {
        public $kuchen = "Apfelkuchen";
    
    }
    
    $pflaume = new myClass;
    $pflaume->kuchen = "Pflaumenkuchen";
    
    file_put_contents('pflaume',serialize($pflaume));
    
    unset ($pflaume);
    
    $pflaume = unserialize(file_get_contents('pflaume'));
    echo $pflaume->kuchen;

    Einen Kommentar schreiben:


  • Zeichen32
    antwortet
    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.

    Einen Kommentar schreiben:


  • jspit
    antwortet
    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.

    Einen Kommentar schreiben:


  • Zeichen32
    antwortet
    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($serialized, true);

            
    $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"
        }
      }
    }

    Einen Kommentar schreiben:


  • kaminbausatz
    antwortet
    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"
        }
      }
    }

    Einen Kommentar schreiben:


  • Zeichen32
    antwortet
    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?

    Einen Kommentar schreiben:


  • hellbringer
    antwortet
    Nur ist das kein JSON, was da erzeugt wird.

    Einen Kommentar schreiben:


  • Zeichen32
    antwortet
    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($serialized, true);

            
    $this->a = $json['a'];
            
    $this->b = $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)
    }

    Einen Kommentar schreiben:


  • thomasd.codes
    antwortet
    kaminbausatz Kannst du mir bitte etwas genauer erläutern was du genau meinst?

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


  • thomasd.codes
    antwortet
    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.

    Einen Kommentar schreiben:


  • kaminbausatz
    antwortet
    thomasd.codes
    Kann es sein, dass Alf2016 wieder aufgetaucht ist??

    Einen Kommentar schreiben:


  • JaMa
    antwortet
    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.

    Einen Kommentar schreiben:


  • thomasd.codes
    antwortet
    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.

    Einen Kommentar schreiben:

Lädt...
X