streaming json encoder ist eine PHP-Bibliothek, die eine Reihe von Klassen bereitstellt, die bei der Streaming-Kodierung von JSON helfen, d. h. es Ihnen ermöglicht, das JSON-Dokument Stück für Stück zu kodieren, anstatt das gesamte Dokument auf einmal zu kodieren. Im Vergleich zur integrierten json_encode Funktion gibt es zwei Hauptvorteile:
Mit anderen Worten: Der streaming json encoder kann den größten Nutzen bieten, wenn Sie große Datensätze verarbeiten müssen, deren Verarbeitung andernfalls zu viel Speicher beanspruchen würde.
Um die Interoperabilität zu erhöhen, stellt die Bibliothek auch einen PSR-7-kompatiblen Stream zur Verwendung mit Frameworks und HTTP-Anfragen bereit.
Die API-Dokumentation ist verfügbar unter: http://violet.riimu.net/api/streaming-json-encoder/
^1.0 ) Der einfachste Weg, diese Bibliothek zu installieren, besteht darin, Composer zum Verwalten Ihrer Abhängigkeiten zu verwenden. Um diese Bibliothek über Composer zu installieren, befolgen Sie einfach diese beiden Schritte:
Erwerben Sie die composer.phar , indem Sie die Composer-Befehlszeileninstallation in Ihrem Projektstammverzeichnis ausführen.
Sobald Sie das Installationsskript ausgeführt haben, sollte sich die Datei composer.phar in Ihrem Projektstammverzeichnis befinden und Sie können den folgenden Befehl ausführen:
php composer.phar require "violet/streaming-json-encoder:^1.1"
Nachdem Sie diese Bibliothek über Composer installiert haben, können Sie die Bibliothek laden, indem Sie die Datei vendor/autoload.php einbinden, die von Composer während der Installation generiert wurde.
Wenn Sie bereits mit der Verwendung von Composer vertraut sind, können Sie die Bibliothek alternativ als Abhängigkeit hinzufügen, indem Sie die folgende Datei composer.json zu Ihrem Projekt hinzufügen und den composer install Installationsbefehl ausführen:
{
"require" : {
"violet/streaming-json-encoder" : " ^1.1 "
}
} Wenn Sie Composer nicht zum Laden der Bibliothek verwenden möchten, können Sie die Bibliothek auch manuell herunterladen, indem Sie die neueste Version herunterladen und den Ordner src in Ihr Projekt extrahieren. Anschließend können Sie die bereitgestellte Datei src/autoload.php einschließen, um die Bibliotheksklassen zu laden.
Bitte beachten Sie, dass bei Verwendung von Composer auch automatisch die anderen erforderlichen PHP-Bibliotheken heruntergeladen werden. Wenn Sie diese Bibliothek manuell installieren, müssen Sie auch die anderen erforderlichen Bibliotheken verfügbar machen.
Diese Bibliothek bietet drei verschiedene Möglichkeiten, die Bibliothek über die Klassen BufferJsonEncoder , StreamJsonEncoder und den PSR-7-kompatiblen Stream JsonStream zu nutzen.
Der Puffer-Encoder ist am nützlichsten, wenn Sie das JSON-Dokument so generieren müssen, dass keine Rückrufe zur Verarbeitung des generierten JSON übergeben werden müssen.
Der einfachste Weg, den BufferJsonEncoder zu verwenden, besteht darin, ihn mit dem zu kodierenden JSON-Wert zu instanziieren und die Methode encode() aufzurufen, um die gesamte Ausgabe als Zeichenfolge zurückzugeben:
<?php
require ' vendor/autoload.php ' ;
$ encoder = new Violet StreamingJsonEncoder BufferJsonEncoder ([ ' array_value ' ]);
echo $ encoder -> encode (); Die nützlichste Art, diesen Encoder zu verwenden, besteht jedoch darin, ihn als Iterator zu verwenden. Da der Encoder die Iterator Schnittstelle implementiert, können Sie den generierten JSON einfach mit einer foreach-Schleife durchlaufen:
<?php
require ' vendor/autoload.php ' ;
$ encoder = new Violet StreamingJsonEncoder BufferJsonEncoder ( range ( 0 , 10 ));
foreach ( $ encoder as $ string ) {
echo $ string ;
}Es ist auch erwähnenswert, dass der Encoder Iteratoren für Werte unterstützt. Darüber hinaus wird auch jeder an den Encoder übergebene Abschluss aufgerufen und stattdessen der Rückgabewert als Wert verwendet. Das vorherige Beispiel könnte auch wie folgt geschrieben werden:
<?php
require ' vendor/autoload.php ' ;
$ encoder = new Violet StreamingJsonEncoder BufferJsonEncoder ( function () {
for ( $ i = 0 ; $ i <= 10 ; $ i ++) {
yield $ i ;
}
});
foreach ( $ encoder as $ string ) {
echo $ string ;
} Nebenbei bemerkt: Der Encoder berücksichtigt auch die JsonSerializable -Schnittstelle und ruft jsonSerialize für Objekte auf, die die Schnittstelle implementieren.
Der Stream-Encoder funktioniert sehr ähnlich wie der BufferJsonEncoder , da er dieselbe abstrakte Klasse erweitert. Der Hauptunterschied besteht jedoch darin, wie sie mit der Übergabe der JSON-Ausgabe umgehen.
Der StreamJsonEncoder akzeptiert einen Callable als zweites Konstruktorargument. Immer wenn JSON ausgegeben werden muss, wird dieses Callable mit zwei Argumenten aufgerufen: der eigentlichen auszugebenden Zeichenfolge und dem Typ des auszugebenden Tokens (der eine der JsonToken Konstanten ist).
Wenn kein Callable übergeben wird, gibt der StreamJsonEncoder einfach den JSON mit einer Echo-Anweisung aus. Zum Beispiel:
<?php
require ' vendor/autoload.php ' ;
$ encoder = new Violet StreamingJsonEncoder StreamJsonEncoder ([ ' array_value ' ]);
$ encoder -> encode (); Die Methode encode() in StreamJsonEncoder gibt die Gesamtzahl der Bytes zurück, die sie an die Ausgabe übergeben hat. Mit diesem Encoder ist es beispielsweise praktisch, JSON per Streaming in eine Datei zu schreiben. Zum Beispiel:
<?php
require ' vendor/autoload.php ' ;
$ fp = fopen ( ' test.json ' , ' wb ' );
$ encoder = new Violet StreamingJsonEncoder StreamJsonEncoder (
range ( 1 , 100 ),
function ( $ json ) use ( $ fp ) {
fwrite ( $ fp , $ json );
}
);
$ encoder -> encode ();
fclose ( $ fp ); Die Stream-Klasse stellt ein PSR-7-kompatibles StreamInterface zum Streamen von JSON-Inhalten bereit. Es verwendet tatsächlich den BufferJsonEncoder um die harte Arbeit zu erledigen, und wickelt die Aufrufe einfach in einen Stream ein.
Der Konstruktor von JsonStream akzeptiert entweder einen als JSON zu kodierenden Wert oder eine Instanz von BufferJsonEncoder (womit Sie die Kodierungsoptionen festlegen können). Anschließend können Sie den Stream mit den von der PSR-7-Schnittstelle bereitgestellten Methoden bearbeiten. Zum Beispiel:
<?php
require ' vendor/autoload.php ' ;
$ iterator = function () {
foreach ( new DirectoryIterator ( __DIR__ ) as $ file ) {
yield $ file -> getFilename ();
}
};
$ encoder = ( new Violet StreamingJsonEncoder BufferJsonEncoder ( $ iterator ))
-> setOptions ( JSON_PRETTY_PRINT );
$ stream = new Violet StreamingJsonEncoder JsonStream ( $ encoder );
while (! $ stream -> eof ()) {
echo $ stream -> read ( 1024 * 8 );
}Weitere Informationen zu PSR-7-Streams finden Sie in der PSR-7-Dokumentation.
In vielerlei Hinsicht soll der streaming json encoder hauptsächlich als Ersatz für json_encode() dienen. Da der Encoder jedoch für die Verarbeitung großer Datenmengen gedacht ist, gibt es einige bemerkenswerte Unterschiede in der Art und Weise, wie er mit Objekten und Arrays umgeht.
Um zu bestimmen, wie ein Objekt codiert werden soll, versucht der Encoder zunächst, die Objektwerte auf folgende Weise aufzulösen:
JsonSerializable implementiert, wird die implementierte Methode jsonSerialize() aufgerufen und stattdessen der Rückgabewert verwendet.Closure aufgerufen und stattdessen der Rückgabewert verwendet. Es werden jedoch keine anderen invokables auf diese Weise aufgerufen.Der zurückgegebene Wert wird in einer Schleife verarbeitet, bis er nicht mehr weiter aufgelöst werden kann. Danach wird entschieden, ob das Array oder Objekt als Array oder als Objekt kodiert wird. Dabei kommt folgende Logik zum Einsatz:
Traversable implementiert und entweder eine ganze Zahl 0 als ersten Schlüssel oder überhaupt keine Werte zurückgibt, wird es als JSON-Array codiert (unabhängig von anderen Schlüsseln). Alle anderen Objekte, die Traversable implementieren, werden als JSON-Objekte codiert. Beachten Sie jedoch, dass bei Verwendung der JSON-Kodierungsoption JSON_FORCE_OBJECT alle Objekte und Arrays als JSON-Objekte kodiert werden.
Beachten Sie, dass alle Objekte über eine foreach -Anweisung durchlaufen werden. Dies bedeutet, dass alle Traversable Objekte mithilfe der vom Iterator zurückgegebenen Werte codiert werden. Für andere Objekte bedeutet dies, dass die öffentlichen Eigenschaften verwendet werden (gemäß Standarditerationsverhalten).
Alle anderen Werte (dh Nullen, boolesche Werte, Zahlen und Zeichenfolgen) werden genauso behandelt wie json_encode() (und tatsächlich wird es zum Codieren dieser Werte verwendet).
Sowohl BufferJsonEncoder als auch StreamJsonEncoder verfügen über eine Methode setOptions() zum Ändern der JSON-Codierungsoptionen. Die akzeptierten Optionen sind die gleichen wie die, die von der Funktion json_encode() akzeptiert werden. Der Encoder verwendet intern weiterhin die Methode json_encode() um andere Werte als Arrays oder Objekte zu codieren. Einige Optionen haben auch zusätzliche Auswirkungen auf die Encoder:
JSON_FORCE_OBJECT werden alle Arrays und Objekte als JSON-Objekte codiert, ähnlich wie bei json_encode() .JSON_PRETTY_PRINT bewirkt, dass der Encoder Leerzeichen ausgibt, um die Ausgabe besser lesbar zu machen. Der verwendete Einzug kann mit der Methode setIndent() geändert werden, die entweder ein String-Argument zur Verwendung als Einzug oder eine Ganzzahl zur Angabe der Anzahl der Leerzeichen akzeptiert.JSON_PARTIAL_OUTPUT_ON_ERROR führt dazu, dass der Encoder die Ausgabe trotz Codierungsfehlern fortsetzt. Andernfalls wird die Kodierung angehalten und der Kodierer löst eine EncodingException aus. Diese Bibliothek unterliegt dem Copyright (c) 2017-2022 von Riikka Kalliomäki.
Lizenz- und Kopierinformationen finden Sie unter LIZENZ.