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 esTrue
, omite las claves que no son cadenas, números oNone
. -
ensure_ascii
: Si esTrue
, 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 esTrue
, 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)
GO TO FULL VERSION