PHP-Klasseninstanz in JSON

Lesezeit: 3 Minuten

Ich versuche, den Inhalt eines Objekts in einem JSON-Format wiederzugeben. Ich bin ziemlich unerfahren mit PHP und habe mich gefragt, ob es dafür eine vordefinierte Funktion gibt (wie json_encode()) oder müssen Sie die Zeichenfolge selbst erstellen? Wenn ich “PHP-Objekt zu JSON” google, finde ich nur Müll.

class Error {
    private $name;
    private $code;
    private $msg;
    public function __construct($ErrorName, $ErrorCode, $ErrorMSG){
        $this->name = $ErrorName;
        $this->code = $ErrorCode;
        $this->msg = $ErrorMSG;
    }
    public function getCode(){
        return $this->code;
    }
    public function getName(){
        return $this->name;
    }
    public function getMsg(){
        return $this->msg;
    }
    public function toJSON(){
        $json = "";

        return json_encode($json);
    }
}

Was soll JSON zurückgeben:

{ name: “the content of $name var”, code : 1001, msg : error while doing request}

  • prob gab es zum Zeitpunkt des Schreibens noch nicht, aber wenn Sie jetzt >5.4 verwenden, können Sie Ihre Klasse implementieren lassen JsonSerializable

    – Andreas Braun

    3. April 2014 um 7:47 Uhr

Benutzer-Avatar
Clexmond

Du bist gleich da. Schauen Sie sich an get_object_vars in Kombination mit json_encode und Sie haben alles, was Sie brauchen. Tun:

json_encode(get_object_vars($error));

sollte genau das zurückgeben, wonach Sie suchen.

Die Kommentare brachten get_object_vars Respekt für die Sichtbarkeit hervor, also erwägen Sie, in Ihrer Klasse so etwas wie das Folgende zu tun:

public function expose() {
    return get_object_vars($this);
}

Und dann ändern Sie den vorherigen Vorschlag in:

json_encode($error->expose());

Das sollte sich um Sichtbarkeitsprobleme kümmern.

  • Ich habe das schon einmal versucht, aber es kam {} zurück. Schätze, ich habe vorher etwas falsch gemacht, danke Mann!

    – Reinhard

    27. März 2012 um 19:27 Uhr

  • AFAIK get_object_vars berücksichtigt auch den Bereich, in dem es aufgerufen wird. Wenn Sie es also von einer Methode innerhalb des Objekts aufrufen, haben Sie auch Zugriff auf die privaten Variablen

    – Felipe Ribeiro

    27. März 2012 um 19:30 Uhr


  • json_encode(get_object_vars($error));zeigt öffentliche Mitglieder an, keine privaten.

    – Grifos

    27. März 2012 um 19:30 Uhr

  • Ja, get_object_vars respektiert die Sichtbarkeit, also müssen Sie wahrscheinlich eine “expose”-Methode oder etwas Ähnliches hinzufügen, um damit umzugehen. Ich werde diesen Vorschlag der Antwort hinzufügen.

    – Clexmond

    27. März 2012 um 19:32 Uhr

Benutzer-Avatar
Mandy Schöpf

Eine alternative Lösung in PHP5.4+ verwendet die JsonSerializable Schnittstelle.

class Error implements \JsonSerializable
{
    private $name;
    private $code;
    private $msg;

    public function __construct($errorName, $errorCode, $errorMSG)
    {
        $this->name = $errorName;
        $this->code = $errorCode;
        $this->msg = $errorMSG;
    }

    public function jsonSerialize()
    {
        return get_object_vars($this);
    }
}

Anschließend können Sie Ihr Fehlerobjekt in konvertieren JSON mit json_encode

$error = new MyError("Page not found", 404, "Unfortunately, the page does not exist");
echo json_encode($error);

Sehen Sie sich das Beispiel an hier

Weitere Informationen zu \JsonSerializable

  • Beachten Sie, dass der Name der Klasse MyError hätte sein sollen, da das zweite Code-Snippet eine neue Instanz von MyError und nicht Error erstellt

    – Weitz

    6. September 2021 um 6:36 Uhr

Sie müssen Ihre Variable öffentlich machen, damit sie auf erscheinen json_encode().

Außerdem ist der gesuchte Code

public function toJSON(){
    return json_encode($this);
}

  • Ich mag das, da ich keine Möglichkeit kenne, wie get_object_vars Eigenschaften ausschließen kann, die Sie nicht serialisieren möchten.

    – Jim H.

    27. März 2012 um 19:31 Uhr

Benutzer-Avatar
Naftali

public function toJSON(){
    $json = array(
        'name' => $this->getName(),
        'code' => $this->getCode(),
        'msg' => $this->getMsg(),
    );

    return json_encode($json);
}

Demo: http://codepad.org/mPNGD6Gv

Unter Linux schreibt das Folgende den Wert eines bestimmten Klasseneintrags in eine Datei ~/.config/scriptname/scriptname.conferstellen Sie die Datei, wenn sie nicht existiert, und lesen Sie andernfalls den Klassenwert beim Laden und setzen Sie ihn zurück:

/* Example class */
class flag {
  static $COLORSET = ["\033[34;1m","\033[31;1m"];
}
/* Retrieve and set back values, otherwise create config file with the defined value --------------------------------------------------*/
if (!is_file($_SERVER["HOME"]."/.config/".$_SERVER["SCRIPT_NAME"]."https://stackoverflow.com/".$_SERVER["SCRIPT_NAME"].".conf")){
    @mkdir($_SERVER["HOME"]."/.config/".$_SERVER["SCRIPT_NAME"]);
    @file_put_contents($_SERVER["HOME"]."/.config/".$_SERVER["SCRIPT_NAME"]."https://stackoverflow.com/".$_SERVER["SCRIPT_NAME"].".conf",json_encode(["COLORSET"=>flag::$COLORSET]));
} else {
    flag::$COLORSET = json_decode(file_get_contents($_SERVER["HOME"]."/.config/".$_SERVER["SCRIPT_NAME"]."https://stackoverflow.com/".$_SERVER["SCRIPT_NAME"].".conf"), true)["COLORSET"];       
}

1282220cookie-checkPHP-Klasseninstanz in JSON

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy