miércoles, 4 de mayo de 2011

JSON como formato de intercambio para la web

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 los módulos 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. 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:


>>> 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 desde nuestro framework Python favorito.

"