Mostramos el modo de producir una cadena con notación JSON a partir de variables y objetos de PHP con la función json_encode().
Como ya comentamos en el artículo anterior, en el que presentamos las librerías más fundamentales hacer JSON desde PHP, existen diversas formas para implementar funcionalidades de procesamiento de archivos JSON desde PHP. En concreto en este artículo vamos a ver las funciones nativas de PHP que sirven para este tema, que se encuentran disponibles desde la versión de PHP 5.2. Cabe recordar, no obstante, que estas mismas funciones nativas se pueden instalar por separado, si es que no las tenemos y que existen otras librerías que también ofrecen posibilidades similares.
Veremos entonces cómo producir cadenas con notación JSON a partir de variables simples, arrays y objetos PHP.
Crear un JSON desde PHP
Para crear una cadena para expresar un objeto u otro tipo de variable con JSON en PHP se dispone de una función llamada json_encode(), que recibe lo que deseamos convertir en notación JSON y devuelve una cadena de texto con el JSON producido.Podemos convertir en JSON cualquier cosa que necesitemos, como una cadena, una variable numérica, un array -normal o asociativo- y objetos con todo tipo de datos dentro. Veremos varios ejemplos que ilustrarán este proceso.
$mivariable = "hola";
print_r(json_encode($mivariable));
Esto devuelve:
"hola"
Ahora convertimos un array normal:
$miArray = array(1,4,6,8,3,34.8,9,43);
print_r(json_encode($miArray));
Que devuelve:
[1,4,6,8,3,34.8,9,43]
Estos ejemplos anteriores son sin duda quizás demasiado simples, pero la cosa empieza a tener sentido cuando se convierte un array asociativo en JSON, como se puede ver a continuación.
$miArray = array("manzana"=>"verde", "uva"=>"Morada", "fresa"=>"roja");
print_r(json_encode($miArray));
{"manzana":"verde","uva":"Morada","fresa":"roja"}
Este resultado ya tiene una forma parecida a lo que estamos acostumbrados a ver en JSON. Podríamos fijarnos que la cadena que devuelve no tiene saltos de línea e identación de los elementos, con lo que la lectura se dificulta un poco por seres humanos. No obstante, podríamos utilizar esa cadena para crear una variable Javascript y por supuesto podremos acceder a cualquier valor del JSON, de una manera parecida a esta:
<script>
JSONFrutas = eval(<?php echo json_encode($miArray);?>);
alert(JSONFrutas.manzana);
</script>
Como se ha visto, para almacenar el JSON en una variable Javascript, sin almacenar la propia cadena, sino el objeto que representa, tenemos que utilizar la función Javascript eval(). Luego podemos acceder a los componentes del JSON como lo hacemos con cualquier objeto, variable, operador punto y luego el nombre de la propiedad a acceder.
Crear un objeto con PHP y convertirlo en JSON
Como decía, lo bonito es que desde PHP podemos convertir cualquier objeto que tengamos, para generar el JSON del mismo y poder enviarlo a Javascript o cualquier otro lenguaje o componente que necesitemos que lo procese. El mecanismo es exactamente igual, con la salvedad que primero tenemos que crear una clase, instanciar un objeto y luego convertirlo a JSON con json_encode().Así crearíamos una clase e instaciaríamos ojetos con ella.
//creo una clase arbol
class NodoArbolDHTML{
var $nombre;
var $url;
var $hijos;
function __construct($nombre,$url){
$this->nombre = $nombre;
$this->url = $url;
}
function anadirHijo($nodoHijo, $nombre){ //añadir un hijo
if (!isset($this->hijos)){
$this->hijos = array();
}
$this->hijos[$nombre] = $nodoHijo;
}
}
Como se ha visto, se ha implementado una clase NodoArbolDHTML, con la que podríamos crear una estructura de árbol. El árbol tiene distintos nodos y cada uno a su vez tiene un nombre, una URL y un conjunto que hijos, que también son nodos del árbol.
Ahora, podríamos instanciar objetos tipo nodo, para crear el árbol, de la siguiente manera.
$raiz = new NodoArbolDHTML("Raiz", "http://www.loquesea.com");
$miNodo = new NodoArbolDHTML("Mi arbolito", "http://www.oi.com");
$raiz->anadirHijo($miNodo, "loquesea");
$miNodo2 = new NodoArbolDHTML("Mi otro nodo", "http://www.as.com");
$raiz->anadirHijo($miNodo, "otro");
Con esto ya tenemos la mayor parte del trabajo creado, porque para producir el JSON simplemente tenemos que llamar a la función json_encode(), que ya hemos visto repetidas veces:
print_r(json_encode($raiz));
Con esto mostraríamos en la página la cadena:
{"nombre":"Raiz","url":"http://www.loquesea.com","hijos":{"loqesea":{"nombre":"Mi arbolito","url":"http://www.oi.com","hijos":null},"otro":{"nombre":"Mi arbolito","url":"http://www.oi.com","hijos":null}}}
De nuevo la forma como se muestra la cadena no tiene muy fácil lectura, por la falta de saltos de línea y los identados. Pero bueno, eso no es problema para Javascript, como podremos ver en el código siguiente, que ilustra la manera en que podemos utilizar ese JSON para crear objetos en el cliente.
<?php
$arbol_php = json_encode($raiz);
?>
<script>
var arbolJavascript = eval(<?php echo $arbol_php;?>);
alert(arbolJavascript.hijos.loquesea.nombre);
alert(arbolJavascript.hijos.otro.url);
</script>
Escapar caracteres especiales en cadenas JSON
En la notación JSON se utiliza Unicode como juego de caracteres, por su universalidad. Por tanto, en Unicode hay determinados caracteres, como pueden ser la eñe, letras con acentos, etc, que tienen que convertirse en sus correspondientes códigos de escape para que todo funcione correctamente. Por ejemplo, la letra "ñ" tiene el código "u00f1". En las cadenas que utilizamos en la notación JSON se deben colocar entonces caracteres Unicode, excepto las comillas dobles (que se utilizan para delimitar la cadena y por tanto se debe escapar) y la barra invertida, que es el carácter de escape.Afortunadamente, la función PHP json_encode() hace la conversión de las cadenas a Unicode automáticamente, por lo que no nos deberíamos preocuparnos por este detalle, sin embargo, PHP toma de manera predeterminada que la cadena de origen está en UTF-8, por lo que, si trabajamos con archivos en ISO-8859-1, tendremos que convertirlos antes a UTF-8.
Por ejemplo, en mi ejemplo PHP, que tengo en mi ordenador guardado con ISO-8859-1, si intento crear un JSON de esta manera:
$miArray = array("París"=>"Francia", "Madrid"=>"España");
print_r(json_encode($miArray));
Obtengo la siguiente cadena:
{null:"Francia","Madrid":null}
Esto se soluciona, como digo, convirtiendo antes las cadenas a UTF-8, al menos las que tienen caracteres distintos del alfabeto inglés.
<?php
$miArray = array(utf8_encode("París")=>"Francia", "Madrid"=>utf8_encode("España"));
print_r(json_encode($miArray));
?>
Con lo que obtengo la siguiente cadena codificada con JSON:
{"Paru00eds":"Francia","Madrid":"Espau00f1a"}
Con este artículo de desarrolloweb .com ya hemos visto cómo podemos producir cadenas con notación JSON a partir de variables, arrays u objetos. Esperamos que haya sido instructivo y os citamos para el próximo artículo, en el que veremos cómo crear variables u objetos PHP a partir del contenido de cadenas JSON.
Miguel Angel Alvarez
Fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Com...