streaming json encoder es una biblioteca PHP que proporciona un conjunto de clases para ayudar a codificar JSON en forma de streaming, es decir, permitiéndole codificar el documento JSON poco a poco en lugar de codificar todo el documento a la vez. En comparación con la función json_encode
incorporada, existen dos ventajas principales:
En otras palabras, el streaming json encoder puede proporcionar el mayor beneficio cuando necesita manejar grandes conjuntos de datos que, de otro modo, ocuparían demasiada memoria para procesar.
Para aumentar la interoperabilidad, la biblioteca también proporciona un flujo compatible con PSR-7 para usar con marcos y solicitudes HTTP.
La documentación de la API está disponible en: http://violet.riimu.net/api/streaming-json-encoder/
^1.0
) La forma más sencilla de instalar esta biblioteca es utilizar Composer para manejar sus dependencias. Para instalar esta biblioteca a través de Composer, simplemente siga estos dos pasos:
Adquiera composer.phar
ejecutando la instalación de la línea de comandos de Composer en la raíz de su proyecto.
Una vez que haya ejecutado el script de instalación, debería tener el archivo composer.phar
en la raíz de su proyecto y podrá ejecutar el siguiente comando:
php composer.phar require "violet/streaming-json-encoder:^1.1"
Después de instalar esta biblioteca a través de Composer, puede cargar la biblioteca incluyendo el archivo vendor/autoload.php
que generó Composer durante la instalación.
Si ya está familiarizado con el uso de Composer, también puede agregar la biblioteca como una dependencia agregando el siguiente archivo composer.json
a su proyecto y ejecutando el comando composer install
:
{
"require" : {
"violet/streaming-json-encoder" : " ^1.1 "
}
}
Si no desea utilizar Composer para cargar la biblioteca, también puede descargar la biblioteca manualmente descargando la última versión y extrayendo la carpeta src
a su proyecto. Luego puede incluir el archivo src/autoload.php
proporcionado para cargar las clases de la biblioteca.
Tenga en cuenta que el uso de Composer también descargará automáticamente las otras bibliotecas PHP requeridas. Si instala esta biblioteca manualmente, también deberá poner a disposición las otras bibliotecas requeridas.
Esta biblioteca ofrece 3 formas principales diferentes de usar la biblioteca a través de las clases BufferJsonEncoder
, StreamJsonEncoder
y la transmisión compatible con PSR-7 JsonStream
.
El codificador de búfer es más útil cuando necesita generar el documento JSON de una manera que no implique pasar devoluciones de llamada para manejar el JSON generado.
La forma más sencilla de utilizar BufferJsonEncoder
es crear una instancia con el valor JSON para codificar y llamar al método encode()
para devolver la salida completa como una cadena:
<?php
require ' vendor/autoload.php ' ;
$ encoder = new Violet StreamingJsonEncoder BufferJsonEncoder ([ ' array_value ' ]);
echo $ encoder -> encode ();
Sin embargo, la forma más útil de utilizar este codificador es utilizarlo como iterador. A medida que el codificador implementa la interfaz Iterator
, simplemente puede recorrer el JSON generado con un bucle foreach:
<?php
require ' vendor/autoload.php ' ;
$ encoder = new Violet StreamingJsonEncoder BufferJsonEncoder ( range ( 0 , 10 ));
foreach ( $ encoder as $ string ) {
echo $ string ;
}
También vale la pena señalar que el codificador admite iteradores para valores. Es más, cualquier cierre pasado al codificador también se llamará y el valor de retorno se utilizará como valor. El ejemplo anterior también podría escribirse como:
<?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 ;
}
Como nota al margen, el codificador también respetará la interfaz JsonSerializable
y llamará a jsonSerialize
para los objetos que implementen la interfaz.
El codificador de flujo funciona de manera muy similar a BufferJsonEncoder
, ya que extienden la misma clase abstracta. Sin embargo, la diferencia clave está en cómo manejan el paso de la salida JSON.
StreamJsonEncoder
acepta un invocable como segundo argumento del constructor. Siempre que es necesario generar JSON, este invocable se llama con dos argumentos, la cadena real a generar y el tipo de token a generar (que es una de las constantes JsonToken
).
Si no se pasa ningún invocable, StreamJsonEncoder simplemente generará el JSON mediante una declaración de eco. Por ejemplo:
<?php
require ' vendor/autoload.php ' ;
$ encoder = new Violet StreamingJsonEncoder StreamJsonEncoder ([ ' array_value ' ]);
$ encoder -> encode ();
El método encode()
en StreamJsonEncoder
devuelve el número total de bytes que pasó a la salida. Este codificador hace que sea conveniente, por ejemplo, escribir el JSON en un archivo en forma de transmisión. Por ejemplo:
<?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 clase de transmisión proporciona una StreamInterface
compatible con PSR-7 para transmitir contenido JSON. En realidad, utiliza BufferJsonEncoder
para hacer el trabajo duro y simplemente envuelve las llamadas en forma de flujo.
El constructor de JsonStream
acepta un valor para codificar como JSON o una instancia de BufferJsonEncoder
(que le permite configurar las opciones de codificación). Luego podrá operar en la transmisión utilizando los métodos proporcionados por la interfaz PSR-7. Por ejemplo:
<?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 );
}
Para obtener más información sobre las transmisiones de PSR-7, consulte la documentación de PSR-7.
En muchos sentidos, el streaming json encoder está diseñado para funcionar principalmente como un reemplazo directo de json_encode()
. Sin embargo, dado que el codificador está diseñado para manejar grandes conjuntos de datos, existen algunas diferencias notables en la forma en que maneja objetos y matrices.
Primero, para determinar cómo codificar un objeto, el codificador intentará resolver los valores del objeto de las siguientes maneras:
JsonSerializable
se llama al método implementado jsonSerialize()
y en su lugar se utiliza el valor de retorno.Closure
y en su lugar se utilizará el valor de retorno. Sin embargo, no se llama a ningún otro invocable de esta manera.El valor devuelto se repite hasta que no se puede resolver más. Después de eso, se toma una decisión sobre si la matriz u objeto está codificado como una matriz o como un objeto. Se utiliza la siguiente lógica:
Traversable
y devuelve un número entero 0
como primera clave o no devuelve ningún valor, se codificará como una matriz JSON (independientemente de otras claves). Todos los demás objetos que implementan Traversable
están codificados como objetos JSON. Sin embargo, tenga en cuenta que si se utiliza la opción de codificación JSON JSON_FORCE_OBJECT
, todos los objetos y matrices se codifican como objetos JSON.
Tenga en cuenta que todos los objetos se atraviesan mediante una declaración foreach
. Esto significa que todos los objetos Traversable
se codifican utilizando los valores devueltos por el iterador. Para otros objetos, esto significa que se utilizan las propiedades públicas (según el comportamiento de iteración predeterminado).
Todos los demás valores (es decir, valores nulos, booleanos, números y cadenas) se tratan exactamente de la misma manera que json_encode()
(y de hecho, se usa para codificar esos valores).
Tanto BufferJsonEncoder
como StreamJsonEncoder
tienen un método setOptions()
para cambiar las opciones de codificación JSON. Las opciones aceptadas son las mismas que acepta la función json_encode()
. El codificador todavía usa internamente el método json_encode()
para codificar valores distintos de matrices u objetos. Algunas opciones también tienen efectos adicionales en los codificadores:
JSON_FORCE_OBJECT
obligará a que todas las matrices y objetos se codifiquen como objetos JSON similares a json_encode()
.JSON_PRETTY_PRINT
hace que el codificador genere espacios en blanco para que la salida sea más legible. La sangría utilizada se puede cambiar usando el método setIndent()
que acepta un argumento de cadena para usar como sangría o un número entero para indicar el número de espacios.JSON_PARTIAL_OUTPUT_ON_ERROR
hará que el codificador continúe con la salida a pesar de los errores de codificación. De lo contrario, la codificación se detendrá y el codificador generará una EncodingException
. Esta biblioteca tiene Copyright (c) 2017-2022 Riikka Kalliomäki.
Consulte LICENCIA para obtener información sobre licencias y copias.