streaming json encoder est une bibliothèque PHP qui fournit un ensemble de classes pour vous aider à encoder JSON en streaming, c'est-à-dire vous permettant d'encoder le document JSON petit à petit plutôt que d'encoder l'ensemble du document à la fois. Par rapport à la fonction json_encode
intégrée, il y a deux avantages principaux :
En d’autres termes, l’ streaming json encoder peut offrir le plus grand avantage lorsque vous devez gérer de grands ensembles de données dont le traitement pourrait autrement prendre trop de mémoire.
Afin d'augmenter l'interopérabilité, la bibliothèque fournit également un flux compatible PSR-7 à utiliser avec les frameworks et les requêtes HTTP.
La documentation de l'API est disponible sur : http://violet.riimu.net/api/streaming-json-encoder/
^1.0
) Le moyen le plus simple d'installer cette bibliothèque consiste à utiliser Composer pour gérer vos dépendances. Afin d'installer cette bibliothèque via Composer, suivez simplement ces deux étapes :
Acquérez le composer.phar
en exécutant l’installation en ligne de commande Composer à la racine de votre projet.
Une fois que vous avez exécuté le script d'installation, vous devriez avoir le fichier composer.phar
à la racine de votre projet et vous pouvez exécuter la commande suivante :
php composer.phar require "violet/streaming-json-encoder:^1.1"
Après avoir installé cette bibliothèque via Composer, vous pouvez charger la bibliothèque en incluant le fichier vendor/autoload.php
généré par Composer lors de l'installation.
Si vous savez déjà comment utiliser Composer, vous pouvez également ajouter la bibliothèque en tant que dépendance en ajoutant le fichier composer.json
suivant à votre projet et en exécutant la commande composer install
:
{
"require" : {
"violet/streaming-json-encoder" : " ^1.1 "
}
}
Si vous ne souhaitez pas utiliser Composer pour charger la bibliothèque, vous pouvez également télécharger la bibliothèque manuellement en téléchargeant la dernière version et en extrayant le dossier src
dans votre projet. Vous pouvez ensuite inclure le fichier src/autoload.php
fourni pour charger les classes de la bibliothèque.
Veuillez noter que l'utilisation de Composer téléchargera également automatiquement les autres bibliothèques PHP requises. Si vous installez cette bibliothèque manuellement, vous devrez également rendre disponibles les autres bibliothèques requises.
Cette bibliothèque propose 3 manières principales d'utiliser la bibliothèque via les classes BufferJsonEncoder
, StreamJsonEncoder
et le flux compatible PSR-7 JsonStream
.
L'encodeur de tampon est particulièrement utile lorsque vous devez générer le document JSON d'une manière qui n'implique pas la transmission de rappels pour gérer le JSON généré.
Le moyen le plus simple d'utiliser BufferJsonEncoder
est de l'instancier avec la valeur JSON à encoder et d'appeler la méthode encode()
pour renvoyer l'intégralité de la sortie sous forme de chaîne :
<?php
require ' vendor/autoload.php ' ;
$ encoder = new Violet StreamingJsonEncoder BufferJsonEncoder ([ ' array_value ' ]);
echo $ encoder -> encode ();
Cependant, la manière la plus utile d’utiliser cet encodeur est de l’utiliser comme itérateur. Comme l'encodeur implémente l'interface Iterator
, vous pouvez simplement parcourir le JSON généré avec une boucle foreach :
<?php
require ' vendor/autoload.php ' ;
$ encoder = new Violet StreamingJsonEncoder BufferJsonEncoder ( range ( 0 , 10 ));
foreach ( $ encoder as $ string ) {
echo $ string ;
}
Il convient également de noter que l'encodeur prend en charge les itérateurs pour les valeurs. De plus, toute fermeture transmise à l'encodeur sera également appelée et la valeur de retour utilisée comme valeur à la place. L’exemple précédent pourrait également s’écrire :
<?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 ;
}
En remarque, l'encodeur respectera également l'interface JsonSerializable
et appellera jsonSerialize
pour les objets qui implémentent l'interface.
L'encodeur de flux fonctionne de manière très similaire au BufferJsonEncoder
car ils étendent la même classe abstraite. Cependant, la principale différence réside dans la manière dont ils gèrent la transmission de la sortie JSON.
Le StreamJsonEncoder
accepte un appelable comme deuxième argument du constructeur. Chaque fois que JSON doit être généré, cet appelable est appelé avec deux arguments, la chaîne réelle à générer et le type du jeton à générer (qui est l'une des constantes JsonToken
).
Si aucun appelable n'est transmis, StreamJsonEncoder affichera simplement le JSON à l'aide d'une instruction echo. Par exemple:
<?php
require ' vendor/autoload.php ' ;
$ encoder = new Violet StreamingJsonEncoder StreamJsonEncoder ([ ' array_value ' ]);
$ encoder -> encode ();
La méthode encode()
dans StreamJsonEncoder
renvoie le nombre total d'octets transmis à la sortie. Cet encodeur permet, par exemple, d'écrire le JSON dans un fichier en continu. Par exemple:
<?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 );
La classe stream fournit une StreamInterface
compatible PSR-7 pour diffuser du contenu JSON. Il utilise en fait BufferJsonEncoder
pour effectuer le travail acharné et encapsule simplement les appels dans un flux comme à la mode.
Le constructeur de JsonStream
accepte soit une valeur à encoder en JSON, soit une instance de BufferJsonEncoder
(qui vous permet de définir les options d'encodage). Vous pouvez ensuite opérer sur le flux en utilisant les méthodes fournies par l'interface PSR-7. Par exemple:
<?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 );
}
Pour plus d'informations sur les flux PSR-7, veuillez vous référer à la documentation PSR-7.
À bien des égards, l' streaming json encoder est destiné à fonctionner principalement en remplacement de json_encode()
. Cependant, étant donné que l'encodeur est destiné à traiter de grands ensembles de données, il existe des différences notables dans la façon dont il gère les objets et les tableaux.
Tout d'abord, pour déterminer comment encoder un objet, l'encodeur tentera de résoudre les valeurs de l'objet de la manière suivante :
JsonSerializable
la méthode implémentée jsonSerialize()
est appelée et la valeur de retour est utilisée à la place.Closure
sera invoquée et la valeur de retour sera utilisée à la place. Cependant, aucun autre invocable n'est appelé de cette manière.La valeur renvoyée est bouclée jusqu'à ce qu'elle ne puisse plus être résolue. Après cela, une décision est prise quant à savoir si le tableau ou l'objet est codé en tant que tableau ou en tant qu'objet. La logique suivante est utilisée :
Traversable
et qu'il renvoie un entier 0
comme première clé ou ne renvoie aucune valeur, il sera codé sous forme de tableau JSON (indépendamment des autres clés). Tous les autres objets implémentant Traversable
sont codés en tant qu'objets JSON. Notez cependant que si l'option de codage JSON JSON_FORCE_OBJECT
est utilisée, tous les objets et tableaux sont codés en tant qu'objets JSON.
Notez que tous les objets sont parcourus via une instruction foreach
. Cela signifie que tous les objets Traversable
sont codés en utilisant les valeurs renvoyées par l'itérateur. Pour les autres objets, cela signifie que les propriétés publiques sont utilisées (conformément au comportement d'itération par défaut).
Toutes les autres valeurs (c'est-à-dire les valeurs nulles, booléennes, les nombres et les chaînes) sont traitées exactement de la même manière que json_encode()
(et en fait, il est utilisé pour coder ces valeurs).
BufferJsonEncoder
et StreamJsonEncoder
ont tous deux une méthode setOptions()
pour modifier les options d'encodage JSON. Les options acceptées sont les mêmes que celles acceptées par la fonction json_encode()
. L'encodeur utilise toujours en interne la méthode json_encode()
pour encoder des valeurs autres que des tableaux ou des objets. Quelques options ont également des effets supplémentaires sur les encodeurs :
JSON_FORCE_OBJECT
forcera tous les tableaux et objets à être codés en tant qu'objets JSON similaires à json_encode()
.JSON_PRETTY_PRINT
amène l'encodeur à afficher des espaces afin de rendre la sortie plus lisible. L'indentation utilisée peut être modifiée à l'aide de la méthode setIndent()
qui accepte soit un argument de chaîne à utiliser comme indentation, soit un entier pour indiquer le nombre d'espaces.JSON_PARTIAL_OUTPUT_ON_ERROR
entraînera la poursuite de la sortie par l'encodeur malgré les erreurs d'encodage. Sinon, l'encodage s'arrêtera et l'encodeur lancera une EncodingException
. Cette bibliothèque est protégée par Copyright (c) 2017-2022 Riikka Kalliomäki.
Voir LICENCE pour les informations sur la licence et la copie.