JSON con Mootools

JSON (JavaScript Object Notation) es un formato basado en Javascript para intercambio de datos. JSON es una alternativa a XML pues brinda sencillez al momento de leer los datos, en Javascript puede ser analizado utilizando eval(), además provee sencillez para manipular los datos. Para mas información acerca de las diferencias con XML además de sus virtudes en: JSON.

Obteniendo los datos
Para nuestro ejemplo vamos a utilizar Google AJAX Search API, el cual es un servicio que nos utilizar los resultados de búsqueda de Google. No utilizaremos la funciones que provee Google si no que lo haremos utilizando JSON, para ello encontramos documentación en Flash and other Non-Javascript Environments.

Si deseamos obtener los resultado de la búsqueda de la palabra Google, lo podemos hacer accediendo al siguiente URL:

http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=Google

Este URL devolverá un objeto conteniendo los resultados de la búsqueda en un array ademas de estadísticas de resultados:

  1. { "results": [
  2.   {
  3.    "GsearchResultClass": "GwebSearch",
  4.    "unescapedUrl": "http://en.wikipedia.org/wiki/Paris_Hilton",
  5.    "url": "http://en.wikipedia.org/wiki/Paris_Hilton",
  6.    "visibleUrl": "en.wikipedia.org",
  7.    "cacheUrl": "http://www.google.com/search?...",
  8.    "title": "\u003cb\u003eParis Hilton\u003c/b\u003e",
  9.    "titleNoFormatting": "Paris Hilton",
  10.    "content": "In 2006, she released her debut..."
  11.   },
  12.   {
  13.    "GsearchResultClass": "GwebSearch",
  14.    "unescapedUrl": "http://www.imdb.com/name/nm0385296/",
  15.    "url": "http://www.imdb.com/name/nm0385296/",
  16.    "visibleUrl": "www.imdb.com",
  17.    "cacheUrl": "http://www.google.com/search?...",
  18.    "title": "\u003cb\u003eParis Hilton\u003c/b\u003e",
  19.    "titleNoFormatting": "Paris Hilton",
  20.    "content": "Self: Zoolander. Socialite..."
  21.   },
  22.   ...
  23.  ],
  24.  "cursor": {
  25.   "pages": [
  26.    { "start": "0", "label": 1 },
  27.    { "start": "4", "label": 2 },
  28.    { "start": "8", "label": 3 },
  29.    { "start": "12","label": 4 }
  30.   ],
  31.   "estimatedResultCount": "59600000",
  32.   "currentPageIndex": 0,
  33.   "moreResultsUrl": "http://www.google.com/search?..."
  34.  }
  35. }, 200, null)

Creando un Proxy
Normalmente cuando se accede a datos JSON se hacen sobre el mismo dominio, pero como nosotros deseamos acceder a los datos de Google necesitamos crear un proxy para cambiar de dominio los datos recibidos. Esto por que nos browsers no permites acceder a datos de otros dominios. Entonces creamos el archivo proxy.php.

[php]
$apiQue = “Google”; // variable a consultar
$apiKey = “tu_key_google”; // key para acceder al servicio
$apiUrl = “http://ajax.googleapis.com/ajax/services/search/web”;
if (isset($_GET[‘query’])){
$apiQue = urlencode($_GET[‘query’]);
}
readfile($apiUrl.”?v=1.0&key=”.$apiKey.”&q=”.$apiQue);
[/php]

Cargando los datos con Mootools
La nueva versión de Mootools trae el método Request.JSON que permite cargar y parsear automáticamente datos JSON, para nuestro caso cargaremos los datos del proxy recién creado y lo mostraremos utilizando la función alert. Primero incluimos la librería Mootools en el header de nuestro html y luego obtenemos los datos JSON.

  1. <script type="text/javascript" src="mootools.js"></script>
  1. window.addEvent('domready', function() {
  2.     var path = "proxy.php?query=unijimpe";
  3.     var json = new Request.JSON({url: path, onComplete: onLoad});
  4.     json.get();
  5.     function onLoad(obj){
  6.         var results = obj.responseData.results;
  7.         for (i=0; i<results.length; i++) {
  8.             var tmp = results&#91;i&#93;;
  9.             alert(i + " --> " + tmp.title + "\n" + tmp.url)
  10.         }
  11.     }
  12. });

Pueden ver el resultado en: /json/index.html.

Como pueden observar, la función onLoad se ejecuta cuando se ha completado la carga de los datos, dentro de esta función podemos acceder a los datos recién cargados como si fueran objetos es decir podemos acceder a todas sus propiedades utilizando el operador punto (.).

Entonces si deseamos mostrar la cantidad total de resultados podríamos hacer mediante obj.estimatedResultCount, entonces para acceder a los resultados de la búsqueda accedemos a obj.responseData.results el cual contiene un array con los resultados de la búsqueda por lo cual utilizamos un FOR para acceder a cada elemento.

Ahora si deseamos mostrar estos resultados como HTML y no como alerts, lo primero es crear un div en donde escribiremos los resultados y modificar brevemente nuestro script.

  1. window.addEvent('domready', function() {
  2.     var path = "proxy.php?query=unijimpe";
  3.     var json = new Request.JSON({url: path, onComplete: onLoad});
  4.     json.get();
  5.     function onLoad(obj){
  6.         var tmpHTML = "";
  7.         var results = obj.responseData.results;
  8.         for (i=0; i<results.length; i++) {
  9.             var tmp = results&#91;i&#93;;
  10.             tmpHTML+= "<a href='"+tmp.url+"'>"+tmp.title+"</a>";
  11.             tmpHTML+= "<br />"+tmp.content+"<br/>";
  12.             tmpHTML+= "<i>"+tmp.url+"</i><br /><br />";
  13.         }
  14.         $("results").set("html", tmpHTML);
  15.     }
  16. });
  1. <div id="results">Loading...</div>

Pueden ver el resultado en: /json/json.html.

Finalmente, agregamos un campo te texto y un botón para crear un formulario de búsqueda para mostrar la potencia de JSON. Esto lo hacemos con el siguiente código.

  1. window.addEvent('domready', function() {
  2.     var path = "proxy.php?query=unijimpe";
  3.     var json = new Request.JSON({url: path, onComplete: onLoad});
  4.     json.get();
  5.     function onLoad(obj){
  6.         var tmpHTML = "";
  7.         var results = obj.responseData.results;
  8.         for (i=0; i<results.length; i++) {
  9.             var tmp = results&#91;i&#93;;
  10.             tmpHTML+= "<a href='"+tmp.url+"'>"+tmp.title+"</a>";
  11.             tmpHTML+= "<br />"+tmp.content+"<br/>";
  12.             tmpHTML+= "<i>"+tmp.url+"</i><br /><br />";
  13.         }
  14.         $("results").set("html", tmpHTML);
  15.     }
  16.  
  17.     function sendSearch() {
  18.         $("results").set("html", "Loading...");
  19.         path = "proxy.php?query=" + $("q").value;
  20.         json = new Request.JSON({url:path, onComplete: onLoad});
  21.         json.get();
  22.     }
  23.    
  24.     $("bt").addEvent("click", sendSearch);
  25. });
  1. <div id="search">
  2. Buscador JSON
  3. <input type="text" id="q" name="q" />
  4. <input type="submit" id="bt" name="bt" value="Buscar" />
  5. </div>
  6. <div id="results">&nbsp;</div>

Pueden ver el resultado en: /json/search.html.

Como pueden ver utilizando Mootools para manejar JSON es muy fácil el implementar aplicaciones con acceso remoto a datos o también llamado AJAX solo que no estamos utilizando XML y además tenemos la posibilidad de formatear a nuestro antojo los resultados obtenidos.

Mas Información

Comentarios Total 3 comentarios


JSON con Flash » unijimpe
Publicado: 05/08/2008 12:40 am

[…] comentabamos hace poco en JSON con Mootools, JSON es un formato para intercambio de datos que a diferencia de XML es mucho mas ligero pues se […]

mundano
Publicado: 22/08/2008 3:36 am

Hacia tiempo que no leía un articulo tan bien escrito, tan conciso y con unos ejemplos tan buenos. Realmente útil.
¡Enhorabuena!

Gio
Publicado: 15/04/2009 3:26 pm

Como siempre tu blog sacandome de apuros :)

 

Comentar

En este blog los comentarios están moderados, serán mostrados cuando el administrador los apruebe. Por favor, evita comentarios ofensivos u obscenos por que no serán aprobados.
Si deseas publicar código fuente debes hacerlo entre las etiquedas <code> y </code>, además debes reemplazar los carácteres < por &lt; y > por &gt;.

(Requerido)

(Requerido, no será publicado)

(Requerido)

(Tags aceptados: <a> <em> <strong> <code> <ul> <li>)