Como hacer

Cómo trabajar con JSON en PHP

JSON es uno de los formatos de serialización de datos más utilizados. Ha crecido desde sus orígenes internamente de JavaScript (JSON significa notación de objetos JavaScript) para convertirse en el formato de votación para muchas API web y sistemas de configuración.

PHP se envía con soporte JSON incorporado. Históricamente, las funciones se proporcionaron como una extensión separada. El tirada en 2020 de PHP 8.0 convirtió JSON en una extensión permanentemente activa que no se puede eliminar.

Leída de datos JSON

Para analizar datos JSON, use el json_decode() función. Su firma completa es la sucesivo:

json_decode(string $json, bool|null $associative=null, int $depth=512, int $flags=0) : mixed;

La invocación más simple es tener lugar una esclavitud JSON sin otros argumentos. Trabajaremos con {“foo”: “bar”} que decodifica a una instancia de PHP genérico stdClass. Nuestro nuevo objeto tendrá una propiedad foo con el valía de bar.

Si prefiere cobrar una matriz asociativa, pase true al $associative parámetro de json_decode(). El ejemplo inicial luego se decodificaría a [“foo”=> “bar”].

los $depth El parámetro le permite controlar el nivel de anidamiento mayor para analizar. Usted obtendrá null si el JSON se anida más profundamente que el nivel establecido, no se hará ningún intento de analizar los datos.

los $flags acepta una máscara de bits de banderas opcionales que alteran el comportamiento de observación. Estos se describen en detalle en el manual de PHP y le permiten puntualizar cómo se deben manejar los tipos de datos específicos.

Manejo de errores de observación

Por defecto, json_decode() volverá null cuando se pasa una esclavitud JSON no válida. Esto presenta un problema porque un null es una esclavitud JSON válida. No tienes forma de entender si el null el valía de retorno se debe al JSON conteniendo nullo porque el JSON estaba mal formado y no se pudo analizar.

PHP 7.3 finalmente abordó este problema de larga data agregando el JSON_THROW_ON_ERROR bandera. Pase esta constante al $flags parámetro de json_decode() para hacer que PHP caso una excepción cuando se encuentre JSON no válido:

json_decode("['malformed json", true, 512, JSON_THROW_ON_ERROR);

Enabling this behaviour is generally desirable but it does make for a rather unwieldy invocation. You can use PHP 8’s named arguments to simplify things a bit, as you won’t need to pass explicit values for the optional parameters:

json_decode(json: "['malformed json", flags: JSON_THROW_ON_ERROR);

The two examples shown above are equivalent to each other. The only difference is the latter syntax requires PHP 8.

Serializing data to JSON

You can serialize PHP values into JSON strings using the json_encode() function. Its signature is as follows:

json_encode(mixed $value, int $flags=0, int $depth=512) : string|false;

PHP accepts any value as $value, except for resources. Data types are automatically handled to ensure they have an appropriate mapping in the generated JSON. PHP objects and associative arrays will become JSON objects containing all the enumerable property/key-value pairs of the input value. PHP scalar types map directly into JSON with no transformation.

Like its decoding counterpart, json_encode() accepts $flags and $depth parameters. Take care around the order though – in a quirk of the PHP standard library, the position of these two optional parameters is switched compared to json_decode().

Many more flags are supported when encoding data. Here’s some to be aware of:

  • JSON_FORCE_OBJECT – Convert PHP numerical arrays to JSON objects instead of arrays. This handles the case where a variable contains an associative array which might be empty. When the array is empty ([]), se crearía una matriz JSON; cuando no está hueco[“foo”=> “bar”]), en su división se emitiría un objeto. Habilitar esta marca garantiza que un objeto siempre se use en el JSON codificado.
  • JSON_PRETTY_PRINT – La salida JSON de PHP normalmente se minimiza, lo que es ideal cuando se envía a través de la red como parte de una solicitud HTTP. Establecer esta bandera agregará nuevos caracteres de dirección y sangría cibernética a la esclavitud JSON, haciéndola más adecuada para archivos de configuración y otros escenarios donde los humanos leerán la salida.
  • JSON_PRESERVE_ZERO_FRACTION – Obliga a PHP a codificar flotantes como 0.0 exactamente, en división de recortar la fracción para escribir 0 en el JSON (que podría analizarse incorrectamente como un número impasible).
  • JSON_NUMERIC_CHECK – Convierte automáticamente cadenas numéricas en números en la salida JSON, en división de conservarlas como cadenas. Con esto recaudador, un valía de PHP “234.5” será emitido como 234.5 en el JSON.
  • JSON_PARTIAL_OUTPUT_ON_ERROR – Intente continuar escribiendo incluso a posteriori de que se encuentre un error de codificación. PHP intentará sustituir los títulos inválidos para producir algún resultado, incluso si no está completo.

Puede obtener la repertorio completa de banderas en la documentación de PHP. El resto son en su mayoría opciones específicas para personalizar la codificación utilizada en escenarios particulares.

Llevando JSON a la capa de dominio de su aplicación

Es más probable que los backends web complejos utilicen las funciones JSON de PHP en el contexto de la difusión de respuestas HTTP. Eso probablemente significa que codificará instancias de clases de capa de dominio, como BlogPost.

Gusto json_encode() con una instancia de una clase da como resultado una esclavitud JSON que contiene un solo objeto. PHP enumerará el sabido propiedades de la clase y agréguelas como pares esencia / valía en el objeto codificado en JSON.

class BlogPost { protected int $Id = 1; public string $Title = "Example"; } // produces '{"Title": "Example"}' $json = json_encode(new BlogPost());

PHP no puede aceptar automáticamente a propiedades privadas o protegidas. Por lo tanto, esta implementación predeterminada es insuficiente para todas las clases, excepto para las más simples. En cambio, sus clases pueden implementar el JsonSerializable interfaz. Esto le permite puntualizar cómo se transformarán las instancias a JSON.

JsonSerializable define un solo método, jsonSerialize(), que PHP llamará siempre que sea necesario serializar una instancia en JSON:

class BlogPost implements JsonSerializable { protected int $Id = 1; public string $Title = "Example"; public function jsonSerialize() { return [ "Id" => $this -> Id, "Title" => $this -> Title ]; } } // produces '{"Id": 1, "Title": "Example"}' $json = json_encode(new BlogPost());

Implementar JsonSerializable le permite tomar el control del proceso de serialización. Sus instancias pueden designar qué exponer, lo que podría incluir propiedades protegidas, títulos calculados dinámicamente y datos devueltos de llamadas a métodos.

Ni siquiera necesita devolver una matriz. los jsonSerializable la firma del método especifica un mixed tipo de retorno, para que pueda proporcionar cualquier valía que PHP pueda serializar en JSON. Puede devolver otro objeto para que PHP lo serialice de forma recursiva.