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.

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:
- El primer argumento es la cadena que vamos a decodificar
- 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"]
- 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.
- 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í.
Hola queria saber si hay alguna forma de retorna imagens del banco de dato utilizando json_encode.
Quiero hacer un sistema de scroll inifinito en mi pagina pero necesito retorna imagens
Hola, podrías mostrar la lista de imágenes y luego agregarlas al HTML ya sea con JavaScript puro o con un framework.
Saludos
Pingback: Codificar y decodificar JSON con Go/GoLang - Parzibyte's blog
Pingback: Aprende a usar curl - Parzibyte's blog
Pingback: Enviar y recibir JSON con encabezados usando PHP y cURL - Parzibyte's blog