Codificar y decodificar JSON en PHP: todo lo que necesitas saber

Publicado por parzibyte en

PHP es un lenguaje del lado del servidor en donde se puede crear una API que se comunique a través de JSON, tanto para leer peticiones como para responder. Hoy veremos cómo codificar y decodificar JSON en PHP con funciones nativas.

Por defecto, PHP tiene algunos errores al codificar en JSON, ya que a veces algunos números no son codificados como números, sino como cadenas; por eso veremos cómo evitar eso y personalizar la salida gracias a las constantes JSON de PHP.

Trabajando con JSON en PHP

Trabajando con JSON en PHP

También veremos cómo manejar los errores; limitar la profundidad de los objetos y otras cosas muy importantes al trabajar con JSON en el lenguaje PHP.

Con PHP y JSON podemos codificar cualquier tipo de variable; no importa si es un booleano, entero, cadena o flotante; todo se codifica correctamente. Lo mismo es para los arreglos u objetos; u objetos con arreglos en su interior.

Requisitos y/o recomendaciones

Si deseas probar los ejemplos, primero instala XAMPP. Después puedes ejecutar los archivos desde la terminal, o probarlos en línea.

¿Quieres codificar y decodificar JSON en JavaScript? mira este post.

Convertir valores de PHP a su representación JSON

Para convertir una variable de PHP a su representación en JSON se usa la función json_encode. Esta función regresa una cadena (o false en caso de error), y recibe 3 argumentos; los últimos dos opcionales.

El primer argumento es la variable que va a codificar. El segundo argumento es una mascara de bits con algunas constantes predefinidas que veremos más abajo. El tercer argumento es la profundidad; si tenemos un objeto con más objetos en su interior, podemos especificar que no se codifique todo, sino hasta un cierto nivel de profundidad.

Aquí hay algunos ejemplos de cómo se codifica JSON en PHP. Más abajo veremos al segundo y tercer argumento en acción.

Ahora sí veamos más ejemplos.

El segundo argumento de json_encode: constantes para modificar el comportamiento

Múltiples constantes se pueden usar en combinación, usando el operador |. La lista completa de las constantes que podemos usar está aquí.

Lo que mostraré será cómo forzar que la salida sea numérica y no como cadena.

Para ello se utiliza la constante JSON_NUMERIC_CHECK al llamara a json_encode. Aquí un ejemplo:

Hay otras constantes útiles, por ejemplo, JSON_PRETTY_PRINT agrega espacios para que el JSON se muestre con las tabulaciones y espacios que lo hacen legible; útil si estamos imprimiendo directamente el JSON generado.

Otra constante útil es JSON_PRESERVE_ZERO_FRACTION, que mantiene el .0 en un número flotante y obliga a que se especifique que dicho número es flotante; por ejemplo, si tenemos el número 15.0 y lo codificamos, se convierte en 15; pero si se pone la constante, ahora sí se imprime bien. Veamos el ejemplo:

De ahí las demás constantes pueden servirnos dependiendo de nuestras necesidades. Por cierto, podemos combinarlas usando |. Si quiero que se imprima de forma legible (JSON_PRETTY_PRINT) y que mantenga el cero en los flotantes (JSON_PRESERVE_ZERO_FRACTION), hago esto:

Así podemos combinar todas las constantes predefinidas; eso fue un ejemplo pero podemos combinar cualquiera.

El tercer argumento de json_encode: la profundidad máxima

Si especificamos la profundidad máxima, al codificar un objeto JSON en PHP se regresará false si se excede la misma. Aquí un ejemplo:

Estos límites sirven para cuando no sabemos qué tan profundo es un objeto y queremos protegernos de alguna manera. Entre más niveles de profundidad, más tiempo se tarda en codificar; por eso es que existe esta opción.

Si queremos manejar el error, podemos usar una función que está más abajo.

Manejar errores al codificar JSON en PHP

Si de alguna manera json_encode devuelve false, debemos ver qué salió mal. Para ello, PHP proporciona igualmente algunas constantes de error. Me he dado a la tarea de crear una función que nos permite saber qué cosa está mal.

Recuerda que los errores no deben imprimirse, en cambio deberían guardarse en un log.

Y así es como terminamos la parte de codificar JSON en PHP.

Decodificar JSON

Para convertir una cadena JSON a su representación como variable dentro del lenguaje, usamos json_decode. Esta función también tiene sus argumentos:

  1. El primer argumento es la cadena que vamos a decodificar
  2. Como segundo argumento, se especifica si queremos que los objetos se codifiquen como arreglos asociativos. Por defecto, se devuelve como objeto y podemos acceder a sus propiedades con $objeto->clave. En caso de que sea un arreglo asociativo, se accede con $objeto["clave"]
  3. El tercer argumento indica la profundidad; la misma que veíamos anteriormente al codificar, pero ahora para decodificar. Por defecto el valor es de 512.
  4. Como último argumento tenemos a las opciones, que igualmente son constantes. Al momento de escribir el post sólo existe JSON_BIGINT_AS_STRING que convierte valores numéricos grandes a flotantes.

Devuelve el valor NULL en caso de error, o el valor codificado en caso de éxito.

Aquí tenemos un ejemplo:

Es fácil decodificar, llamamos a la función y devuelve el JSON decodificado. En ese caso fue un objeto pero se puede decodificar cualquier variable, por ejemplo un arreglo, una cadena, un booleano, etcétera.

Como arreglo asociativo

Ahora veamos el segundo argumento. Si lo ponemos en true, devuelve un arreglo asociativo.

La diferencia es que los objetos se convierten a arreglos.

Especificar profundidad

El tercer argumento es la profundidad, la cual es 512 por defecto. Podemos cambiarla ya sea para que sea mayor o para que sea menor. En caso de que el objeto exceda la profundidad, se devuelve NULL.

Se reutiliza la función para comprobar errores. El error es que se excedió la profundidad. Estos límites igualmente funcionan cuando recibimos un objeto y queremos limitar su profundidad por seguridad o porque queremos poner el límite.

Un uso sería al crear una API en donde los usuarios manden un JSON para hacer determinada cosa. Podríamos limitar la profundidad para evitar que intenten agotar los recursos del servidor.

Referencias

Me he basado en lo que hay en el sitio oficial de PHP aquí y aquí.

 


parzibyte

He trabajado por más de 4 años en el desarrollo de software con experiencia en Java, PHP, JavaScript, HTML, Node.JS, Python, Android y Go. También he trabajado con bases de datos SQL como MySQL y SQLite, así como con bases de datos NoSQL usando MongoDB.Soy bueno utilizando algunos frameworks y herramientas como Firebase, jQuery, AngularJS, VueJS, CodeIgniter, Laravel, BulmaCSS, Bootstrap y Electron.Otros términos que conozco son: Arduino, GraphQL, API's, REST, AJAX, PouchDB, CouchDB, Experiencia de usuario, buenas prácticas de programación, Webpack, NPM, Administración de servidores y programación de scriptsLa plataforma en la que tengo más experiencia es la web, pero en mis ratos libres realizo unos pequeños ejercicios en C# y C.Estoy aquí para ayudarte a resolver tus problemas de programación y depuración :-)

3 Comments

Enviar y recibir JSON con encabezados usando PHP y cURL - Parzibyte's blog · abril 5, 2019 a las 1:04 pm

[…] del código vamos a codificar y decodificar con JSON así que recomiendo pasar por este post. De igual manera vamos a usar el contructor array pero existe una versión más […]

Aprende a usar curl - Parzibyte's blog · mayo 14, 2019 a las 11:55 am

[…] lo uses en producción, es solamente una guía. Estoy codificando con JSON e imprimiéndolo formateado para tener una salida más bonita en la […]

Codificar y decodificar JSON con Go/GoLang - Parzibyte's blog · mayo 16, 2019 a las 12:09 am

[…] esto ya lo hicimos con PHP, Java y […]

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

A %d blogueros les gusta esto: