4 de Mayo, 2011

JSON como formato de intercambio para la web

Hace años que hablaba de YAML, como formato de intercambio alternativo a XML, que nunca me ha convencido (tentador... pero no voy a explicar otra vez porqué no me gusta :P).

No sé porqué por aquel entonces YAML me resultaba tan atractivo, pero igual es porque en Perl resulta muy fácil trabajar con YAML (mucho más que pelearnos con XML y sus módulos para Perl).

Por ejemplo, la configuración de Nautilus Flickr Uploader la guardo en formato YAML:

---
family: no
friends: no
privacy: public
resize: yes
size: 2048
token: XXXXXXXXXXXXXXXXX-XXXXXXXXXXXXXXXX
username: reidrac

Se entiende perfectamente y no hay problemas para editar a mano si es necesario, ¿verdad?

No obstante, desde que trabajo con Python me he pasado completamente a JSON, quizás porque está muy bien soportado en el lenguaje para serializar casi cualquier objeto (con simplejson, hasta que en Python 2.6 se incluyó un módulo json en la distribución base).

JSON (de JavaScript Object Notation) más o menos es igual de legible que YAML, y resulta muy fácil de manipular no solo en Python, que es el lenguaje que uso en el servidor, sino también en Javascript, que es el lenguaje del cliente (navegador). Basicamente porque JSON es Javascript ;).

La configuración de Nautilus Flickr Uploader quedaría como sigue en JSON (usando json.dumps(conf, indent=1); sin el indent los objetos complejos pueden ser un poco ilegibles :P):

{
 "username": "reidrac", 
 "token": "XXXXXXXXXXXXXXXXX-XXXXXXXXXXXXXXXX", 
 "family": "no", 
 "privacy": "public", 
 "friends": "no", 
 "resize": "yes", 
 "size": 2048
}

En realidad no hay mucha diferencia, y sigue siendo mejor que XML, pero donde realmente veo la ventaja es cuando intercambiamos datos entre Python y Javascript.

Siguiendo con nuestro ejemplo (con Python 2.7):

>>> import json
>>> conf = {
...  "username": "reidrac", 
...  "token": "XXXXXXXXXXXXXXXXX-XXXXXXXXXXXXXXXX", 
...  "family": "no", 
...  "privacy": "public", 
...  "friends": "no", 
...  "resize": "yes", 
...  "size": 2048
... }
>>> print "var conf = %s;" % json.dumps(conf)
var conf = {"username": "reidrac", "family": "no", "privacy": "public", "token": "XXXXXXXXXXXXXXXXX-XXXXXXXXXXXXXXXX", "friends": "no", "resize": "yes", "size": 2048};
>>>

Tan sencillo ha sido generar código Javascript. Podemos probar con un navegador cualquiera:

var conf = {"username": "reidrac", "family": "no", "privacy": "public", "token": "XXXXXXXXXXXXXXXXX-XXXXXXXXXXXXXXXX", "friends": "no", "resize": "yes", "size": 2048};

/* recorremos el objeto que hemos generado desde Python */
for (key in conf) {
	document.write("<p>La propiedad " + key + " contiene " + conf[key]);
}

Bueno, es más bien un ejemplo tonto (hasta el diccionario en Python es idéntico a la representación en JSON), pero creo que vale para mostrar lo sencillo que es pasar datos a nuestro código Javascript al generar la vista HTML con Python desde nuestro framework favorito.

Actualización: al hilo de esta anotación, me ha parecido interesante esta entrada: The Rise Of JSON. Su argumento es que XML va muy bien para lenguajes fuertemente tipados, y JSON con el resto. Puede ser.

Anotación por Juan J. Martínez, clasificada en: python, javascript, json.

Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 15 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.

Algunas anotaciones relacionadas: