CodeGym /Curso de Java /Python SELF ES /Trabajando con JSON usando json

Trabajando con JSON usando json

Python SELF ES
Nivel 23 , Lección 1
Disponible

2.1 Módulo json

JSON (JavaScript Object Notation) es un formato ligero de intercambio de datos que es fácil de leer y escribir para los humanos, y fácil de analizar y generar para las computadoras. JSON se utiliza comúnmente para transferir datos entre un servidor y una aplicación web, así como para almacenar configuraciones y preferencias.

El módulo json en Python proporciona funciones para la serialización (convertir objetos de Python a cadenas JSON) y deserialización (convertir cadenas JSON a objetos de Python). Este módulo está incorporado en la biblioteca estándar de Python y se utiliza activamente para trabajar con datos JSON.

Las funciones principales del módulo json son muy similares a las de pickle y funcionan de manera similar. ¿Qué esperabas? — ¡es un estándar!

  • Trabajando con cadenas:
    • json.dumps(obj) — Convierte un objeto de Python en una cadena JSON.
    • json.loads(s) — Convierte una cadena JSON en un objeto de Python.
  • Trabajando con archivos:
    • json.dump(obj, file) — Serializa un objeto de Python y lo escribe en un archivo de texto.
    • json.load(file) — Deserializa un objeto de Python desde un archivo de texto que contiene datos en formato JSON.

Vamos a ver un par de ejemplos para recordar mejor cómo funcionan estas funciones.

2.2 Serialización a cadena

Serializando objetos de Python a cadenas JSON

Para serializar un objeto a una cadena, solo necesitas pasarlo a la función json.dumps().


import json

# Ejemplo de objeto para serializar
data = {
    "name": "Alice",
    "age": 30,
    "is_student": False,
    "courses": ["Math", "Science"],
    "address": {
        "city": "New York",
        "zip_code": "10001"
    }
}
            
# Convertir un objeto de Python a una cadena JSON
json_string = json.dumps(data, indent=4)
print("Datos serializados (JSON):", json_string)
        

Deserializando cadenas JSON a objetos de Python

Para obtener un objeto a partir de una cadena, solo necesitas pasar la cadena JSON, que contiene la descripción del objeto, al método json.loads().


import json

# Ejemplo de cadena JSON para deserializar
json_string = '''
    {
        "name": "Alice",
        "age": 30,
        "is_student": false,
        "courses": ["Math", "Science"],
        "address": {
          "city": "New York",
          "zip_code": "10001"
        }
    }
    '''
            
# Convertir una cadena JSON en un objeto de Python
data = json.loads(json_string)
print("Datos deserializados (Python):", data)
        

2.3 Serialización a archivo

Escribiendo objetos de Python en un archivo en formato JSON

Para escribir un objeto en un archivo, necesitas llamar al método json.dump(). Al trabajar con archivos, es importante manejar excepciones para tratar adecuadamente posibles errores. Aquí tienes un ejemplo:


import json

# Ejemplo de objeto para serializar
data = {
    "name": "Bob",
    "age": 25,
    "is_student": True,
    "courses": ["History", "Literature"],
    "address": {
        "city": "Los Angeles",
        "zip_code": "90001"
    }
}
            
# Escribir un objeto de Python en un archivo JSON con manejo de excepciones
try:
    with open('data.json', 'w') as file:
        json.dump(data, file, indent=4)
    print("Datos escritos con éxito en el archivo.")
except IOError:
    print("Error al escribir en el archivo.")
except json.JSONEncodeError:
    print("Error al codificar JSON.")
            
        

Leyendo objetos de Python de un archivo en formato JSON

La lectura también es muy sencilla: simplemente pasamos el archivo al método json.load(). Aquí también es importante manejar excepciones:


import json

# Leyendo un objeto de Python de un archivo JSON con manejo de excepciones
try:
    with open('data.json', 'r') as file:
        data = json.load(file)
    print("Datos deserializados del archivo (Python):", data)
except IOError:
    print("Error al leer el archivo.")
except json.JSONDecodeError:
    print("Error al decodificar JSON.")
        

2.4 Parámetros adicionales de funciones

En la función que realiza la serialización, puedes pasar parámetros adicionales que harán tu JSON más bonito:

  • skipkeys: Si es True, omite las claves que no son cadenas, números o None.
  • ensure_ascii: Si es True, todos los caracteres no ASCII serán escapados usando secuencias de escape Unicode.
  • indent: Si se especifica un número, se agregarán indentaciones para mejorar la legibilidad.
  • sort_keys: Si es True, las claves en JSON serán ordenadas alfabéticamente.

Ejemplo de uso de parámetros en json.dumps():


import json

data = {"c": 3, "b": 2, "a": 1}
            
# Serialización con claves ordenadas e indentaciones
json_string = json.dumps(data, indent=4, sort_keys=True)
print(json_string)
        

2.5 Decodificadores y codificadores personalizados

El módulo json permite el uso de funciones personalizadas para la serialización y deserialización de objetos.

Ejemplo de un codificador personalizado

Primero, creamos una clase codificadora especial que verifica internamente que si el tipo de objeto == datetime, entonces devuelve el objeto como una cadena en formato ISO.


import json
from datetime import datetime
            
class CustomEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime):
            return obj.isoformat()
        return super().default(obj)
            
data = {
    "name": "Alice",
    "timestamp": datetime.now()
}
            
# Serialización con el codificador personalizado
json_string = json.dumps(data, cls=CustomEncoder, indent=4)
print(json_string)

Ejemplo de un decodificador personalizado

Para la operación inversa, también necesitamos una función que convierta una cadena a fecha. Por ejemplo, simplemente podríamos verificar el nombre del campo, y si se llama timestamp, entonces convertir la cadena en un objeto datetime:


import json
from datetime import datetime
        
def custom_decoder(dct):
    if 'timestamp' in dct:
        dct['timestamp'] = datetime.fromisoformat(dct['timestamp'])
    return dct
        
json_string = '''
{
    "name": "Alice",
    "timestamp": "2023-05-15T14:30:00"
}
'''
        
# Deserialización con el decodificador personalizado
data = json.loads(json_string, object_hook=custom_decoder)
print(data)
    
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION