Schlagwort-Archive: JsonSerializable

PHP: Objekte rekursiv mit JsonSerializable als JSON ausgeben

Die Funktion json_encode() liefert bei Objekten nur den öffentlichen Teil der Eigenschaften zurück (das dann auch rekursiv). Wenn Eigenschaften in einem protected- oder private-Bereich stehen, dann werden diese Daten nicht zurückgeliefert.

Möchte man nun ein Objekt, dass aus verschiedenen Unterobjekten besteht ausgeben als JSON, dann versagt hier gewollt json_encode().

Umgehen kann man das Problem mit JsonSerializable. Das gewünschte Objekt muss JsonSerializable implementieren und eine öffentliche Methode jsonSerialize() haben.

In dieser Methode wird über ein return der Teil der Daten zurückgegeben, die json_encode verarbeiten soll:

class Demo implements JsonSerializable 
{
    public $id; // würde exportiert werden
    protected $record; // würde nicht exportiert werden
    private $mode; // würde ebenfalls nicht exportiert werden
    private $unwanted;

    public function jsonSerialize()
    {
        return [
            'id' => $this->id,
            'record' => $this->record,
            'mode' => $this->mode
        ];
    }

Statt einer einfachen Zuweisung der Eigenschaften auf der rechten Seite kann natürlich auch eine Methode des Objekt aufgerufen werden, die dann die gewünschten Daten zurückliefert (zB $this->getRecord()).

Wird jetzt das Objekt Demo mit json_encode() ausgegeben, dann würden im oberen Beispiel die Eigenschaften „id“, „record“ und „mode“ ausgegeben.