JSON (JavaScript Object Notation o Notación de Objetos en JavaScript) es un formato de datos muy liviano, utilizado bastante en el intercambio de información entre aplicaciones.
Esto significa que usando JSON podemos crear sistemas o APIs en algún lenguaje específico, como PHP, y poner los datos a disposición sin preocuparnos por qué lenguaje consumirá esos datos, ya sea JavaScript o cualquier otro lenguaje de programación. ¡Eso es algo increíble!
En este artículo hablaremos sobre cómo manipular JSON en PHP. Para ello, vamos a hablar sobre las funciones diseñadas para ello.
json_encode() - Convertir una variable en JSON
El primer parámetro que esta función espera es la variable que será convertida en una cadena JSON. Generalmente usamos esta función para convertir un array en JSON, pero esta variable puede ser cualquier valor.
Para el primer ejemplo, vamos a crear un array multidimensional de lenguajes de programación. Cada elemento del array mostrará el nombre completo y el nombre corto del lenguaje. Después de crearlo, vamos a llamar a la función json_encode():
<?php
$languages = [
[
"name"=>"PHP 7",
"short_name"=>"PHP"
],
[
"name"=>"JavaScript",
"short_name"=>"JS"
],
[
"name"=>"Vue JS",
"short_name"=>"Vue"
]
];
echo json_encode($languages);
Al acceder a nuestro archivo en el servidor, vemos el siguiente resultado:
Nuestro JSON se mostró correctamente en el navegador. Muy simple, ¿verdad?
Ejecutamos esta función en un array multidimensional. Pero, ¿qué pasa si tenemos un array simple para convertir a JSON? ¿Qué ocurre en este caso? Vamos a verlo ahora. Crearemos un array de cursos y llamaremos de nuevo a la función json_encode():
$courses = ['PHP7', 'JavaScript', 'MySQL', 'Vue'];
echo json_encode($courses);
Veremos el siguiente resultado en el navegador:
No se devolvió ningún error. Pero nota que los corchetes siguieron. Parece que sigue siendo un array. ¿Cómo podríamos forzar que sea un objeto, usando llaves, como en el primer ejemplo? Para resolver este problema, podemos usar un recurso muy interesante de la función json_encode(). Esta función espera un segundo parámetro, que son las opciones de formateo del JSON. Estas opciones son constantes de PHP. Podemos encontrar una lista completa de estas constantes en la documentación de PHP. Pero no te preocupes, porque vamos a hablar sobre algunas de ellas en este artículo.
Forzando un JSON a ser un objeto
El primer ejemplo puede forzar un JSON a ser un objeto. Para ello, usaremos este código:
echo json_encode($courses, JSON_FORCE_OBJECT);
Al actualizar el navegador, vemos el siguiente resultado:
Ahora sí, nuestro JSON tiene notación de objeto.
Hay otras opciones que pueden ayudarnos en algunas situaciones específicas. Veamos algunos ejemplos.
Convertir cadenas en números
Vamos a crear un array que muestre el nombre de varios lenguajes y sus respectivos años de lanzamiento:
$languages = [htpp
[
'name'=>'PHP',
'release_year'=>'1994'
],
[
'name'=>'JavaScript',
'release_year'=>'1995'
],
[
'name'=>'SQL',
'release_year'=>'1974'
]
];
Al llamar a la función json_encode() en esta variable, veremos el siguiente resultado:
Nuestro JSON se devolvió correctamente. Sin embargo, el año de lanzamiento se mostró como una cadena, ya que está entre comillas. ¿No sería más sensato si se mostrara como un número de hecho? Para realizar esta conversión, podemos usar la opción JSON_NUMERIC_CHECK en nuestro código, de esta manera:
echo json_encode($languages, JSON_NUMERIC_CHECK);
Ahora, al visualizar nuevamente en el navegador, vemos el siguiente resultado:
¡Perfecto! Ahora los años se devolvieron como números de hecho, sin las comillas.
Trabajando con URLs en JSON
La siguiente situación que aprenderemos es cuando necesitamos trabajar con URLs en JSON. Vamos a crear un nuevo array de cursos, que devolverá el nombre del curso y su URL:
$courses = [
[
"name"=>"PHP7",
"url"=>"https://www.hcode.com.br/cursos/PHP7"
],
[
"name"=>"JavaScript",
"url"=>"https://www.hcode.com.br/cursos/JSFULL"
],
[
"name"=>"MySQL",
"url"=>"https://www.hcode.com.br/cursos/MYSQL"
],
[
"name"=>"Vue",
"url"=>"https://www.hcode.com.br/cursos/VUE"
]
];
Ahora, vamos a realizar el encode de este array:
echo json_encode($courses);
El resultado será este:
Nota que nuestras URLs se mostraron con las barras “duplicadas”. Lo que ocurre es que estas barras están siendo “escapadas” por JSON. Para resolver este problema, vamos a usar la constante JSON_UNESCAPED_SLASHES:
echo json_encode($courses, JSON_UNESCAPED_SLASHES);
El resultado ahora será el siguiente:
¡Excelente, nuestras URLs están mucho más fáciles de leer!
Un consejo para visualizar el JSON
Podemos aprovechar este momento para dar un consejo muy útil. Estamos consiguiendo leer el JSON normalmente. Sin embargo, si deseas tener una visualización más agradable de estos resultados, recomendamos la extensión JSONView, que está disponible en Google Chrome. Con la ayuda de esta extensión, el JSON que vimos arriba puede ser exhibido de la siguiente manera:
Mucho mejor, ¿no es cierto?
Resolviendo problemas con acentuación
Otra situación en la que las constantes de la función json_encode() pueden ayudarnos es en la cuestión de la acentuación. Para ver este problema en la práctica, vamos a usar PHP para realizar una conexión con la base de datos MySQL y traer la información de los cursos desde esta base. Para ello, utilizaremos el siguiente código:
$connection = new PDO("mysql:dbname=hcode;host=127.0.0.1", "root", "root");
$statement = $connection->prepare('SELECT * FROM courses;');
$statement->execute();
$results = $statement->fetchAll(PDO::FETCH_ASSOC);
La estructura de la tabla de cursos es así:
Nota que los cursos en la base de datos son los mismos. Solo agregamos la expresión “en Práctica” al curso de PHP 7.
Vamos a mostrar la información que PHP nos trajo de MySQL con este código:
echo json_encode($results);
Cuando actualizamos nuestro navegador, vemos el siguiente resultado:
Los datos se mostraron correctamente. Sin embargo, como la palabra “Práctica” tiene un acento, fue convertida en un carácter especial. Puede que nos incomode ver el nombre del curso de esta manera. En este caso, podemos usar la constante JSON_UNESCAPED_UNICODE. Nuestro código cambiará un poco y quedará así:
echo json_encode($results, JSON_UNESCAPED_UNICODE);
Ahora el resultado será el siguiente:
Es más agradable, ¡excelente! Este es sin duda uno de los “trucos” más interesantes de PHP al trabajar con JSON.
¿Y si deseamos combinar dos constantes? Por ejemplo, teniendo en cuenta el último ejemplo, ¿cómo podríamos convertir no solo los caracteres de los datos, sino también no escapar las barras de la URL? Para aplicar más de una constante en la misma variable, podemos usar el signo | (pipe). El ejemplo que acabamos de citar podría quedarse así:
echo json_encode($results, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
Y de esta manera las dos formateos ocurrirían en nuestro JSON.
json_decode() - Convertir una cadena JSON en un objeto o array
Si json_encode() convierte una variable en JSON, la función json_decode() hace precisamente lo contrario.
El primer parámetro que espera es una cadena en JSON. Por defecto, esta función convierte el JSON en un objeto. Si deseamos convertirlo en un array, solo hace falta informar el booleano true como segundo parámetro.
Para ver esta función “en acción”, continuaremos usando el último ejemplo. La columna “photos” de nuestra tabla de cursos es del tipo JSON, una novedad de MySQL 8. De hecho, hablamos sobre otras novedades de esta versión en el Hcode Café #19.
Imagina que deseamos mostrar todas las fotos de los cursos en el navegador. Vamos a usar la función json_decode() para ello.
Nuestro código quedará así;
foreach ($results as $row) {
$photos = json_decode($row['photos'], true);
foreach ($photos as $photo) {
echo "<img src=" . $photo . " />";
}
}
Explicando: realizamos un foreach() en la información devuelta por la base de datos y accedemos a los datos de cada uno de los cursos. Luego convertimos únicamente la columna “photos” a un array y almacenamos su valor en la variable $photos. Por último, realizamos un nuevo foreach() en esta variable para mostrar cada una de las imágenes individualmente mediante una etiqueta . El resultado será el siguiente:
¡Perfecto! Cada una de las imágenes se mostró correctamente en el navegador. ¡Imagina en cuántas situaciones esta función puede ayudarnos!
json_last_error() - Retornando los errores que pueden ocurrir
Sabemos que una de las cosas más comunes en programación son los bugs, y eso también ocurre con JSON. Si hay algún bug, podemos usar la función json_last_error() para descubrir qué problema ocurrió.
Esta función devuelve un número entero. Podemos decir que cada uno de esos números es como un “código” del error. También pueden ser accedidos a través de otras constantes de PHP.
Una lista completa de las posibles constantes puede encontrarse en la documentación de PHP.
Conclusión
En este artículo vimos muchas situaciones en las que las funciones de JSON pueden ayudarnos. Saber manipular esta notación JavaScript es una habilidad muy necesaria para realizar principalmente la comunicación entre servidores.
Si deseas aprender más sobre JSON en PHP, aplicado en proyectos reales, no dejes de hacer nuestro Curso Completo de PHP 7.
Esperamos que les haya gustado y hasta el próximo artículo :)