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.
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.
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>
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.
| Corrigiendo erro de alcance | 04/11/09 |