Heim > Backend-Entwicklung > PHP-Tutorial > So verwenden Sie die JsonSerializable -Schnittstelle

So verwenden Sie die JsonSerializable -Schnittstelle

Joseph Gordon-Levitt
Freigeben: 2025-02-21 10:33:13
Original
125 Leute haben es durchsucht

How to Use the JsonSerializable Interface

So verwenden Sie die JsonSerializable -Schnittstelle

In den letzten Jahren hat JSON als König der Datenwechselformate übernommen. Vor JSON regierte XML den Schlaf. Es war großartig darin, komplexe Daten zu modellieren, aber es ist schwierig zu analysieren und ist sehr ausführlich. JSON startete wirklich mit der Verbreitung reicher Ajax -gesteuerter Websites, da es sich um ein sehr menschlich lesbares Format handelt, das schnell analysiert und seine einfache Schlüssel-/Wertdarstellung die gesamte Ausführlichkeit von XML abnimmt.

Ich denke, wir könnten uns alle einig sein, dass das Schreiben weniger Code, das wiederum weniger Wartung erfordert und weniger Fehler einführt, ein Ziel ist, das wir alle erreichen möchten. In diesem Beitrag möchte ich Ihnen eine wenig bekannte Schnittstelle vorstellen, die in PHP 5.4.0 als JsonSerializable eingeführt wurde.

Bevor die JsonSerializable -Schnittstelle verfügbar war, bedeutete die Rückgabe einer JSON -codierten Darstellung eines Objekts für einen konsumierenden Dienst eines von zwei Dingen.

Key Takeaways

  • Die JsonSerializable -Schnittstelle in PHP 5.4.0 bietet eine effizientere Möglichkeit, eine von JSON codierte Darstellung eines Objekts zurückzugeben, wodurch die Notwendigkeit der Erstellung einer Datenstruktur außerhalb des Objekts oder zur Internalisierung der Codierungsfunktionen innerhalb des Objekts.
  • Die JsonSerializable -Schnittstelle ermöglicht die Implementierung einer JsonSerialize -Methode innerhalb der Klasse, die automatisch ausgelöst wird, wenn eine Instanz der Klasse JSON codiert ist. Diese Methode gibt ein Array der Objektdaten zurück und vereinfacht den Prozess der Aktualisierung der Daten, wenn Änderungen erforderlich sind.
  • Implementierung der JsonSerializable -Schnittstelle verbessert die Wartbarkeit der Code und verringert die Wahrscheinlichkeit, Fehler einzuführen, da sie die Duplikation beseitigt und es anderen erleichtert, die Fähigkeit des Objekts zu testen, durch Überprüfen zu prüfen, ob es sich
  • das hässliche

Der erste Ansatz bestand darin, eine Datenstruktur außerhalb des Objekts zu konstruieren, das alle Daten enthielt, die wir freilegen wollten.

Wir haben hier ein Array verwendet, um die Daten aus dem Kundenobjekt zu halten, das wir codieren wollten, aber es könnte genauso leicht eine STD -Klasse gewesen sein.
<span><span><?php
</span></span><span>
</span><span><span>class Customer
</span></span><span><span>{
</span></span><span>
</span><span>    <span>private $email = null;
</span></span><span>    <span>private $name = null;
</span></span><span>
</span><span>    <span>public function __construct($email, $name)
</span></span><span>    <span>{
</span></span><span>        <span>$this->email = $email;
</span></span><span>        <span>$this->name = $name;
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>public function getName()
</span></span><span>    <span>{
</span></span><span>        <span>return $this->name;
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>public function getEmail()
</span></span><span>    <span>{
</span></span><span>        <span>return $this->email;
</span></span><span>    <span>}
</span></span><span><span>}
</span></span><span>
</span><span><span>$customer = new Customer('customer@sitepoint.com', 'Joe');
</span></span><span>
</span><span><span>$data = [
</span></span><span>    <span>'customer' => [
</span></span><span>        <span>'email' => $customer->getEmail(),
</span></span><span>        <span>'name' => $customer->getName()
</span></span><span>    <span>]
</span></span><span><span>];
</span></span><span>
</span><span><span>echo json_encode($data);</span></span>
Nach dem Login kopieren
Nach dem Login kopieren

Dieser Ansatz war flexibel und diente in sehr einfachen Situationen, in denen wir wussten, dass sich das Kundenobjekt nicht ändern würde, und wir würden nur in diesem Format Kundendaten benötigen. Wir hatten auch die Möglichkeit, dieses Array aus anderen Quellen Daten zu diesem Array hinzuzufügen, wenn wir mussten.

Wie wir jedoch alle zu der einen oder anderen Zeit erlebt haben, können die Annahmen, die wir getroffen haben, zu einem Moment erwiesen werden. Wir können eine Anforderung erhalten, die uns auffordert, der Kundenklasse weitere Daten hinzuzufügen. Diese neuen Daten müssen in den Verbrauchsdienst zurückgegeben werden, und wir möchten dies an zahlreichen Stellen.

Wie Sie sich vorstellen können, wird dieser Ansatz schnell problematisch. Wir müssen diesen Array -Code nicht nur in unserer Anwendung duplizieren, wir müssen uns auch daran erinnern, alle diese Fälle zu aktualisieren, wenn weitere Änderungen zwangsläufig eingehen. Es gibt jedoch einen anderen Weg, das uns dabei hilft, einige dieser Probleme aufzuheben.

das schlechte

Zum Glück waren wir schlau, als die erste Änderungsanfrage eintrat und wir stellten fest, dass die Duplikation unseres Arrays ein Albtraum sein würde. Wir beschlossen also, diese Codierungsfunktionen in unserem Objekt zu verinnerlichen, die Wartungsprobleme zu entfernen und die Verringerung des Wahrscheinlichkeit, Fehler einzuführen.

<span><span><?php
</span></span><span>
</span><span><span>class Customer
</span></span><span><span>{
</span></span><span>
</span><span>    <span>private $email = null;
</span></span><span>    <span>private $name = null;
</span></span><span>
</span><span>    <span>public function __construct($email, $name)
</span></span><span>    <span>{
</span></span><span>        <span>$this->email = $email;
</span></span><span>        <span>$this->name = $name;
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>public function getName()
</span></span><span>    <span>{
</span></span><span>        <span>return $this->name;
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>public function getEmail()
</span></span><span>    <span>{
</span></span><span>        <span>return $this->email;
</span></span><span>    <span>}
</span></span><span><span>}
</span></span><span>
</span><span><span>$customer = new Customer('customer@sitepoint.com', 'Joe');
</span></span><span>
</span><span><span>$data = [
</span></span><span>    <span>'customer' => [
</span></span><span>        <span>'email' => $customer->getEmail(),
</span></span><span>        <span>'name' => $customer->getName()
</span></span><span>    <span>]
</span></span><span><span>];
</span></span><span>
</span><span><span>echo json_encode($data);</span></span>
Nach dem Login kopieren
Nach dem Login kopieren

Wenn jetzt weitere Änderungsanforderungen eingehen, die mehr Daten hinzugefügt und aus dem Kundenobjekt zurückgegeben werden sollen, können wir einfach die Tojson -Methode aktualisieren.

Dieser Ansatz hat jedoch seine eigenen Nachteile. Jeder andere, der auftritt und unseren Kunden nutzen möchte, muss sich dieser Tojson -Methode bewusst sein, da dies nicht leicht überprüft werden kann. Daher benötigen wir eine genaue Dokumentation. Wir müssen uns auch daran erinnern, dass diese Methode jetzt JSON zurückgibt (obwohl wir die Serialisierung außerhalb der Methode verschieben können). Dies macht die Kombination von Kundendaten mit anderen Datenquellen unangenehmer, da wir darauf achten müssen, dass wir das Ergebnis dieser Methode nicht erneut codieren, da dies einige böse Fehler verursachen würde.

das gute

Geben Sie schließlich die JsonSerializable -Schnittstelle ein. Dies gibt uns die Flexibilität des hässlichen Szenarios mit den Vorteilen der Wartbarkeit des schlechten Szenarios. Um diese Schnittstelle zu verwenden, müssen Sie jedoch PHP 5.4.0 ausführen, was Sie sowieso tun sollten, da es viele Verbesserungen gegenüber älteren Versionen gibt.

Also, zu Geschäft.

<span><span><?php
</span></span><span>
</span><span><span>class Customer
</span></span><span><span>{
</span></span><span>
</span><span>    <span>public $email = null;
</span></span><span>    <span>public $name = null;
</span></span><span>
</span><span>    <span>public function __construct($email, $name)
</span></span><span>    <span>{
</span></span><span>        <span>$this->email = $email;
</span></span><span>        <span>$this->name = $name;
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>public function getName()
</span></span><span>    <span>{
</span></span><span>        <span>return $this->name;
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>public function getEmail()
</span></span><span>    <span>{
</span></span><span>        <span>return $this->email;
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>public function toJson()
</span></span><span>    <span>{
</span></span><span>        <span>return json_encode([
</span></span><span>            <span>'customer' => [
</span></span><span>                <span>'email' => $this->getEmail(),
</span></span><span>                <span>'name' => $this->getName()
</span></span><span>            <span>]
</span></span><span>        <span>]);
</span></span><span>    <span>}
</span></span><span><span>}
</span></span><span>
</span><span><span>$customer = new Customer('customer@sitepoint.com', 'Joe');
</span></span><span>
</span><span><span>echo $customer->toJson();</span></span>
Nach dem Login kopieren

Wie Sie sehen können, implementieren wir JsonSerializable, indem wir die Schnittstelle zu unserer Klasse hinzufügen und dann eine jsonserialisierende Methode in den Körper unserer Klasse hinzufügen, um den Schnittstellenvertrag zu erfüllen.

In der JsonSerialize -Methode konstruieren und geben wir ein Array der Objektdaten zurück, wie wir es mit den anderen Beispielen getan haben. Wenn sich noch einmal ändert, können wir diese eine Methode einfach aktualisieren. Sie werden feststellen, dass die JsonSerialize -Methode nur ein Array zurückgibt.

Die Magie kommt, wenn Sie diese Methode auslösen möchten. Alles, was wir jetzt tun müssen, ist JSON COD eine Instanz dieser Klasse, und diese Methode wird automatisch aufgerufen, das Array der Daten wurde zurückgegeben und dann codiert! Nachdem die Klasse eine Schnittstelle implementiert, profitieren wir davon, zu prüfen, ob diese Klasse eine Instanz von JsonSerializable ist. Wenn Sie wollten, können Sie auch Hinweise in Methoden eingeben, um sicherzustellen, dass eine jsonserialisierbare Schnittstelle übergeben wird.

Zusammenfassung

Mit dieser einfachen Implementierung haben wir die Duplikation entfernt, die Wartungsmenge verringert und die Wahrscheinlichkeit, Fehler einzuführen, verringert. Wir haben es auch trivial gemacht, dass eine andere Person, die unseren Code verwendet, um die Fähigkeit des Objekts zu testen, durch Überprüfung zu kodieren, ob es sich um eine Instanz von JsonSerializable handelt.

Die obigen Beispiele sind natürlich erfunden. Ich hoffe jedoch, dass ich es geschafft habe, die Vorteile der Verwendung dieser Schnittstelle zu demonstrieren und Sie dazu zu inspirieren, sie selbst zu verwenden.

häufig gestellte Fragen (FAQs) zu JsonSerializable Interface

Was ist der Hauptzweck der jsonserialisierbaren Schnittstelle in PHP? Wenn ein Objekt an die Funktion json_encode () übergeben wird und die JsonSerializable -Schnittstelle implementiert, wird die Methode jsonSerialize () aufgerufen, sodass das Objekt diktieren kann, wie es serialisiert werden soll. Dies bietet ein hohes Maß an Kontrolle über die JSON -Ausgabe und erleichtert es, komplexe Datenstrukturen zu verwalten oder Transformationen in den Daten durchzuführen, bevor sie codiert werden. 🎜> Die JsonSerialize () -Methode ist Teil der JsonSerializable -Schnittstelle. Wenn ein Objekt, das diese Schnittstelle implementiert, an JSON_Encode () übergeben wird, wird die Methode jsonSerialize () automatisch aufgerufen. Diese Methode sollte eine Datenstruktur zurückgeben, die bereit ist, in JSON serialisiert zu werden. Dies kann ein Array, eine Zeichenfolge, eine Zahl oder sogar ein anderes Objekt sein. Die zurückgegebenen Daten werden dann von JSON_Encode () in eine JSON -String codiert. Die JsonSerialize () -Methode hat Zugriff auf die privaten und geschützten Eigenschaften des Objekts, sodass Sie diese in die für die Serialisierung zurückgegebenen Daten einbeziehen können. Dies kann nützlich sein, wenn Sie den internen Zustand eines Objekts in JSON codieren möchten, aber die Eigenschaften in der Klasse privat oder geschützt halten. > Wenn eine Ausnahme in die Methode jsonSerialize () geworfen wird, wird sie nicht von json_encode () gefangen. Stattdessen wird JSON_Encode () falsch zurückgegeben, und die Ausnahme muss separat gefangen und behandelt werden. Um Ausnahmen in JsonSerialize () zu verarbeiten, können Sie einen Try-Catch-Block innerhalb der Methode selbst verwenden, sodass Sie die Ausnahme verwalten und eine gültige Datenstruktur für die Serialisierung zurückgeben können. ? Um JSON zu dekodieren, würden Sie die Funktion json_decode () verwenden. Sie können jedoch eine Methode in Ihrer Klasse erstellen, um die Dekodierung und Rekonstruktion eines Objekts von einem JSON -String zu verarbeiten.

Wie kann ich die JsonSerializable -Schnittstelle mit verschachtelten Objekten verwenden? Wenn JSON_Encode () auf das übergeordnete Objekt aufgerufen wird, wird auch JsonSerialize () für jedes verschachtelte Objekt aufgerufen, sodass jeder vorliegt, wie es serialisiert werden soll. >

Ja, Sie können die JsonSerializable -Schnittstelle mit Arrays verwenden. Wenn das Array Objekte enthält, sollte jedes Objekt die JsonSerializable -Schnittstelle implementieren. Wenn JSON_Encode () auf das Array aufgerufen wird, wird JsonSerialize () in jedem Objekt innerhalb des Arrays aufgerufen, sodass jeder vorliegt, wie es serialisiert werden soll. ? Dies kann ein Array mit benutzerdefinierten Schlüsseln, einer Zeichenfolge, einer Nummer oder einem anderen Objekt sein. Die Datenstruktur, die Sie von JsonSerialize () zurückgeben, sind die Daten, die in JSON codiert werden. Mehrdimensionale Arrays. Wenn die Arrays Objekte enthalten, sollte jedes Objekt die JsonSerializable -Schnittstelle implementieren. Wenn json_encode () auf das mehrdimensionale Array aufgerufen wird, wird JsonSerialize () in jedem Objekt innerhalb des Arrays aufgerufen, sodass jeder vorhanden ist, wie es serialisiert werden soll. Arrays? Wenn das Array Objekte enthält, sollte jedes Objekt die JsonSerializable -Schnittstelle implementieren. Wenn json_encode () auf das nicht assoziative Array aufgerufen wird, wird JsonSerialize () in jedem Objekt innerhalb des Arrays aufgerufen, sodass jeder vorliegt, wie es serialisiert werden soll.

Das obige ist der detaillierte Inhalt vonSo verwenden Sie die JsonSerializable -Schnittstelle. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage