viernes, 6 de julio de 2012

JSON y el intercambio de datos

En muchos de los frameworks de javascript se usa el formato JSON, y tambien en muchos objetos comunes a la hora de codificar en este mismo lenguaje.

JSON significa "JavaScript Object Notation", y es una de las formas de crear objetos en javascript, de hecho para mi es una de las más sencillas, aunque no sean objetos instanciables.

van más o menos así
<script>


var miObjeto = {
   miPropiedad:'valor',
   miMetodo:function(){
       return this.miPropiedad;
   }
}
alert(miObjeto.miMetodo());


</script>

El código anterior declara un objeto, asignándole una propiedad y un método que devuelve el valor de la propiedad. Luego de terminar la declaración se manda a llamar la función alert() de javascript y se le pasa por parámetro el resultado del método que declaramos en nuestro objeto.

En esto se basa el intercambio de datos con el servidor por AJAX, aunque es muy raro que se devuelvan métodos, pero es posible. En la mayoría de los casos se devuelven sólo propiedades que luego pueden ser parseadas por el framework que usemos o por funciones que hayamos elaborado. Claro que esto tiene la limitante, por usar el objeto xmlHttpRequest, de recibir datos solamente de peticiones hacia el mismo nombre de dominio, por cuestiones de seguridad.

A pesar de eso, hay otra forma de hacer una llamada de este estilo hacia otro servidor o nombre de dominio, llamada JSONP (JavaScript Object Notation with Padding).
Este se basa en la capacidad que tienen los navegadores de incluir scripts de otros dominios para ejecutarse dentro del entorno en el que se esta trabajando. Para usarlo del lado del servidor no hay mucha variante, sólamente debemos agregar nuestro objeto JSON como parámetro de una función que se ejecutará en el cliente.
Un ejemplo de esto es el siguiente

Una respuesta en JSON (en el mismo dominio) debería mirarse como esta:
{ idDato:"1", nombreDato:"Mi Dato" }


En cambio una respuesta en JSONP (en otro dominio) se vería como esta:
funcionDelCliente({ idDato:"1", nombreDato:"Mi Dato" })

En el caso de usar JSONP debemos tener una función llamada "funcionDelCliente(obj)" que reciba un objeto como parámetro, y para poder mandarlo a llamar deberíamos de crear la siguiente etiqueta dinámicamente con javascript
<script src="http://mi.otro.dominio.com/scripts/devolverDatos.php?type=JSONP" language="JavaScript"> </script> 
Más información acerca del uso de JSONP con jQuery Aqui



Estas son unas opciones de intercambio de datos que para mi son un poco más prácticas que usar otros formatos estándares como xml, tomando en cuenta que para generar un objeto json con PHP existe una función llamada json_encode que recibe como parámetro un array, de preferencia asociativo, para convertirlo a texto con la nomenclatura de JSON, además algunos Frameworks traen implementadas las funciones necesarias para parsear  estas peticiones, como jQuery o ExtJS que son los que más conozco.