Manejo De Archivos .Json Con Python

Fecha de publicaci贸n: 26 Junio 2021
Tiempo de lectura: 5 min.
Premium: False
N煤mero de visitas: 1819


Sin temor a equivocarme puedo decirte que, tarde o temprano, en alg煤n momento de nuestra vida como desarrollador, tendremos que trabajar con objetos JSON. Ya sea para poder enviar o recibir informaci贸n o inclusive para poder almacenar y/o procesarla. 馃槮

No me mal interprete, el trabajar con objetos JSON no es algo que no me guste, al contrario, creo que los objetos de tipo JSON sin duda llegaron a revolucionar la forma en la cuan manejamos la informaci贸n. Y es justo por ello que en esta ocasi贸n me gustar铆a compartir un peque帽o post sobre c贸mo podemos trabajar con este tipo de estructura en Python. Que te adelanto, es algo mucho m谩s sencillo de lo que parece.

Bien, entonces sin m谩s dilaci贸n, comencemos con la lectura. 馃嵒

M贸dulo JSON

Comencemos con la pregunta obligada 驴Qu茅 es un objeto JSON? Bueno, la respuesta m谩s sencilla es que JSON, por sus siglas al ingles JavaScript Object Notation, es un formato ligero para el intercambio de datos. Utilizando este formato seremos capaces de, tanto enviar como recibir informaci贸n. Esto, principalmente, a trav茅s de internet.

Aqu铆 un ejemplo:

{
    "nombre": "Eduardo",
    "edad": 27,
    "correo": "eduardo78d@gmail.com",
    "cursos": ["Python", "MongoDB", "Flask"]
}

Como podemos observar, la estructura se conforma mediante pares de llaves-valores. Cada llaves tiene la posibilidad de almacenar deferentes tipos de datos: ya sean strings, enteros, flotantes, booleanos, listas, etc... 馃槂 Y en caso la estructura posea 2 o m谩s pares clave-valor estos deber谩n encontrarse separados mediante una coma (,).

Esto sin duda te debe resultar familiar, ya que cada una de estas caracter铆sticas tambi茅n describen a los diccionarios en Python. Quiz谩s la diferencia m谩s notable entre un objeto JSON y un diccionario es que, las llaves para un objeto JSON deber谩n ser (de forma obligatoria) strings, y por su parte un diccionario puede poseer cualquier objeto inmutable como llave. Por todo lo dem谩s, pr谩cticamente son lo mismo. 馃槻

Con todo esto en mente podemos concluir que, para trabajar con Objetos JSON en Python lo haremos utilizando diccionarios.

Afortunadamente para nosotros, en Python existe el m贸dulo json que nos permite convertir objetos JSON a diccionarios de una forma muy sencilla. Veamos un par de ejemplos.

Comencemos con algo sencillo. Por ejemplo, generemos un diccionario utilizando un string con formato JSON. Para esto haremos uso de la funci贸n loads.

import json

json_object =  '''{
    "nombre": "Eduardo",
    "edad": 27,
    "correo": "eduardo78d@gmail.com",
    "cursos": ["Python", "MongoDB", "Flask"]
}'''

user = json.loads(json_object)
print(user)

Obtendr铆amos el siguiente resultado en consola:

{'nombre': 'Eduardo', 'edad': 27, 'correo': 'eduardo78d@gmail.com', 'cursos': ['Python', 'MongoDB', 'Flask']}

Cool, 馃コ una vez con el diccionario ya seremos capaces de obtener los valores con respecto a cada una de sus llaves.

>>> user['nombre']
Eduardo

>>> user['edad']
27

>>> user['cursos']
["Python", "MongoDB", "Flask"]

Ahora, si quisi茅ramos hacer lo inverso, usaremos la funci贸n dumps. La funci贸n dumps nos permite serializar un objeto Python a un objeto JSON.

import json

user = {
    "nombre": "Eduardo",
    "edad": 27,
    "correo": "eduardo78d@gmail.com",
    "cursos": ["Python", "MongoDB", "Flask"]
}

json_object = json.dumps(user)

print(json_object)
print(type(json_object))

Obteniendo como resultado la siguiente salida.

{"nombre": "Eduardo", "edad": 27, "correo": "eduardo78d@gmail.com", "cursos": ["Python", "MongoDB", "Flask"]}
<class 'str'>

Visualizamos que el nuevo objeto es tipo es string; con lo cual confirmamos que hemos generado un objeto JSON utilizando un diccionario. 馃コ

Y 驴Qu茅 pasa si queremos serializar un objeto propio? Bueno, lo intentemos. 馃

import json

class Usuario:
    def __init__(self, username, email):
        self.username = username
        self.email = email


usuario = Usuario('eduardo_gpg', 'eduardo78d@gmail.com')
data = json.dumps(usuario)

print(data)

Si ejecutamos obtendremos un error. Indic谩ndonos que no es posible serializar nuestro objeto. 馃槹

TypeError: Object of type Usuario is not JSON serializable

En estos casos, cuando deseemos serializar objetos propios, lo que podemos hacer es simplemente generar un diccionario a partir de cada uno de los atributos del objeto que deseamos serializar. Una vez con el diccionario, seremos capaces de utilizar la funci贸n dumps sin ning煤n problema.

Si recordamos, los atributos de nuestro objeto se encuentran en el atributo dict. As铆 que podemos utilizar dicho atributo. Claro, siempre y cuando queremos serializar todos los atributos del objeto. 馃

usuario = Usuario('eduardo_gpg', 'eduardo78d@gmail.com')
data = json.dumps(usuario.__dict__)

print(data)

Obteniendo el siguiente resultado.

{"username": "eduardo_gpg", "email": "eduardo78d@gmail.com"}

Archivos .json

Perfecto, ya sabemos tanto crear diccionarios a partir de objetos JSON y viceversa, crear objetos JSON a partir de diccionarios. Ahora aprenderemos tanto leer como crear archivos .json.

Que te parece si comenzamos con la lectura. Y para este nuevo ejemplo hare uso del archivo users.json Un archivo que posee un listado de usuarios en formato JSON.

Para la lectura de este archivo el c贸digo pudiera quedar de la siguiente manera:

import json

with open('users.json') as f:
    payload = json.load(f)

    for user in payload['users']:
        print(user)

Danto como resultado.

{'nombre': 'Eduardo', 'edad': 27}
{'nombre': 'Raquel', 'edad': 29}
{'nombre': 'Fernando', 'edad': 25}
{'nombre': 'Guadalupe', 'edad': 30}

Para este ejemplo imprimimos en consola todos los usuarios de la lista. 馃悕

Ahora, quiz谩s hayas notado que para este ejemplo no estamos haciendo uso de la funci贸n loads, si no de la funci贸n load (en singular). Bueno, esto se debe a que la funci贸n load la usaremos 煤nicamente cuando queramos leer el contenido de un archivo .json en forma binario, por su parte, la funci贸n loads la usaremos para generar un diccionario utilizando un string con formato JSON.

Perfecto, ahora hagamos lo inverso, creemos un archivo .json a partir de un objeto Python. Para ello me apoyar茅 del siguiente listado de usuarios.

users = [
      {
        "nombre": "Eduardo",
        "edad": 27
      },
      {
        "nombre": "Raquel",
        "edad": 29
      },
      {
        "nombre": "Fernando",
        "edad": 25
      },
      {
        "nombre": "Guadalupe",
        "edad": 30
      }
]

Nuestro c贸digo pudiera quedar de la siguiente forma:

import json

with open('users.json', 'w') as f:
  json.dump(users, f, indent=4)

Utilizando la funci贸n dump (En singular) podremos serializar un objeto Python a un objeto json. Lo interesante de esta funci贸n es que, adem谩s de ello, nos permite escribir sobre un archivo, e inclusive, definir la indentaci贸n que usaremos.

Para este ejemplo indico que el listado ser谩 serializado para ser escrito en el archivo users.json con una indentaci贸n de 4 espacios. 馃く

Lo interesante de la funci贸n dumps es que, en caso deseemos serializar el objeto utilizando un orden en las llaves, podemos hacer uso del par谩metro sort_keys.

Aqu铆 un ejemplo.

import json

usuario = {
    'username': 'eduardo_gpg',
    'nombre': 'Eduardo Ismael',
    'age': 27,
    'correo': 'eduardo78d@gmail.com'
}

data = json.dumps(usuario, indent=4, sort_keys=True)
print(data)

Danto como resultado:

{
    "age": 27,
    "correo": "eduardo78d@gmail.com",
    "nombre": "Eduardo Ismael",
    "username": "eduardo_gpg"
}

Las llaves, como podemos observar, ahora se encuentran en orden alfab茅tico, de forma ascendente.

Conclusi贸n

JSON es definitivamente uno de los est谩ndares m谩s importantes en nuestra actualidad. Es por ello que es necesario sepamos trabajar con 茅l en los diferentes lenguajes de programaci贸n que utilicemos en nuestro d铆a a d铆a.

Para Python, como pudimos observar, es relativamente sencillo. Basta con importar el m贸dulo json y utilizar alguna de las 4 funciones que vimos en este post.

  • load
  • loads
  • dump
  • dumps

Pudiendo as铆 crear objetos JSONs utilizando objetos Python o directamente con archivos. 馃嵐

Si quieres conocer m谩s acerca de este m贸dulo de invito a que le eches un vistazo al link de la documentaci贸n oficial.

M谩s Tips y Ejercicios 馃悕

Adquiere una subscripci贸n PyWombat por tan solo $3 USD. al mes.

Conoce los beneficios de ser usuario premium:
Niveles desbloqueados: Ten accesos a todos los niveles de ejercicios. 馃敁
Nuevo l铆mite: Incrementa tu l铆mite de ejercicios por semana. 馃殌
Contenido 煤nico: Recibe semanalmente recursos exclusivos de Python (Videos, Art铆culos y Capitulos del libro PyWombat, comienza como desarrollador Python. 馃悕