Este tutorial refleja lo fácil que es utilizar el lenguaje de programación Python para trabajar con datos JSON. Antes de ahondar más el tema, vamos a definir brevemente lo que entendemos por JSON. Vamos a ver cómo lo define su propia web oficial:
JSON, acrónimo de JavaScript Object Notation, es un formato de texto ligero para el intercambio de datos. JSON es un subconjunto de la notación literal de objetos de JavaScript aunque hoy, debido a su amplia adopción como alternativa a XML, se considera un formato de lenguaje independiente. Es utilizado para proyectos de lenguajes de programación diferentes como C, C++, Java, Javascript, Perl, Python y muchos más. Estas propiedades hacen que JSON sea el lenguaje ideal para el intercambio de datos.
Por lo tanto, JSON se puede considerar como un método simple de crear y almacenar estructuras de datos. La razón por la que JavaScript está en sus siglas se debe al hecho de que se crea un objeto de JavaScript al almacenar los datos con JSON. Sin embargo, no te preocupes, no necesitas saber nada de JavaScript para trabajar con archivos JSON, sino más bien de la sintaxis (formato) de JSON.
En resumen, JSON es una manera de almacenar e intercambiar datos y, gracias a su sintaxis, se utiliza en muchas aplicaciones web. Lo bueno de JSON es que tiene un formato legible por el humano, y es una de las grandes razones de su popularidad, además de su eficacia trabajamos con APIs.
Un ejemplo de datos con formato JSON es la siguiente:
{"name": "Frank", "age": 39, "isEmployed": true}
En este tutorial, os voy a mostrar cómo utilizar Python para trabajar con archivos JSON. ¿Estáis listos? ¡Pues empecemos!
Python y JSON
Python hace que sea sencillo trabajar con archivos JSON. El módulo utilizado para este propósito es el módulo json. Este módulo debe ser incluido (built-in) dentro de tu instalación Python y, por lo tanto, no será necesario instalar módulos externos como ya hicimos cuando trabajamos con archivos PDF y Excel, por ejemplo. Lo único que necesitas hacer con el fin de utilizar este módulo es importarlo:
import json
Pero, ¿qué hace la librería json? Esta librería principalmente parsea el JSON de archivos o strings. También parsea el JSON en un diccionario o en una lista en Python y viceversa, es decir, convierte los diccionarios y las listas de Python en cadenas JSON.
De JSON a Python
Leer JSON significa convertir el JSON en un valor de Python (objeto). Como hemos mencionado anteriormente, la librería json parsea el JSON en un diccionario o en una lista en Python. Con el fin de hacer eso, utilizamos la función loads(), de la siguiente manera:
import json jsonData = '{"name": "Frank", "age": 39}' jsonToPython = json.loads(jsonData)
Si deseas ver la salida, haz un print jsonToPython. Si todo ha salido bien obtendrás el siguiente resultado:
{u'age': 39, u'name': u'Frank'}
Es decir, los datos se devuelven como si fuese un diccionario de Python. Por lo tanto, la declaración print jsonToPython['name'], ¿devolverá algo? Inténtalo...
De Python a JSON
En la sección anterior, hemos visto cómo convertir JSON en un valor de Python (es decir, en un diccionario). En esta sección, os voy a mostrar cómo convertir (codificar) un valor de Python a JSON.
Tenemos el siguiente diccionario en Python:
import json pythonDictionary = {'name':'Bob', 'age':44, 'isEmployed':True} dictionaryToJson = json.dumps(pythonDictionary)
Si hacemos print dictionaryToJson, obtenemos los siguientes datos JSON:
{"age": 44, "isEmployed": true, "name": "Bob"}
Esta salida se considera la representación de los datos del objeto (diccionario). El método dumps() fue la clave para dicha operación.
Es importante señalar en este punto que, JSON no puede almacenar todo tipo de objetos de Python, sólo los siguientes tipos: Lists, Dictionaries, Booleanas, Numbers, Character Strings y None. Por lo tanto, cualquier otro tipo necesitará ser convertidos a alguno de los mencionados con el fin de ser almacenado en JSON.
Supongamos que tenemos la siguiente clase:
class Employee(object): def __init__(self, name): self.name = name
Digamos que hemos creado un nuevo objeto abder, de la siguiente manera:
abder = Employee('Abder')
¿Y si quisiéramos convertir este objeto a JSON? Es decir, ¿hacer json.dumps(abder)? En ese caso, obtendrás un error como el siguiente:
Traceback (most recent call last): File "test.py", line 8, in abderJson = json.dumps(abder) File "/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 243, in dumps return _default_encoder.encode(obj) File "/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 207, in encode chunks = self.iterencode(o, _one_shot=True) File "/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 270, in iterencode return _iterencode(o, 0) File "/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 184, in default raise TypeError(repr(o) + " is not JSON serializable") TypeError: is not JSON serializable
Pero, ¿hay alguna solución? Afortunadamente sí. Para resolver este problema, podemos definir un método similar al siguiente:
def jsonDefault(object): return object.__dict__
Codificar posteriormente el objeto en JSON tal que así:
jsonAbder = json.dumps(abder, default=jsonDefault)
Si haces print jsonAbder, deberás obtener el siguiente resultado:
{"name": "Abder"}
Con esto hemos codificado un objeto de Python (abder) en JSON.
Fuente: A. Ahmed