Saltar al contenido principal
eLearner.app
Módulo 8 · Lección 1 de 429/36 en el curso~10 min
Lecciones del módulo (1/4)

JSON: serialización y parseo

JSON es el formato de intercambio de datos más extendido. El módulo json en la biblioteca estándar lo maneja de forma nativa.

De Python a JSON: dumps

json.dumps(objeto) serializa un objeto Python en una cadena JSON.

Python
import json

dati = {"nome": "Ada", "anni": 36, "skills": ["python", "matematica"]}
json.dumps(dati)
# '{"nome": "Ada", "anni": 36, "skills": ["python", "matematica"]}'

json.dumps(dati, indent=2, sort_keys=True)
# multi-line formatted string, keys sorted

De JSON a Python: loads

json.loads(cadena) analiza una cadena JSON y devuelve objetos Python.

Python
testo = '{"nome": "Ada", "anni": 36}'
d = json.loads(testo)
d["nome"]    # 'Ada'
type(d)      # <class 'dict'>

Mapeo de tipos

JSONPython
objectdict
arraylist
stringstr
numberint / float
trueTrue
falseFalse
nullNone

Desde archivo: dump / load

Python
with open("config.json", "w") as f:
    json.dump(dati, f, indent=2)

with open("config.json") as f:
    dati = json.load(f)

Sin la "s" final funcionan sobre archivos (file-like), con la "s" funcionan sobre cadenas de texto.

Tipos no serializables: default

datetime, set y tus clases personalizadas no son serializables por defecto:

Python
import datetime, json
json.dumps({"ora": datetime.datetime.now()})
# TypeError: Object of type datetime is not JSON serializable

Puedes pasar una función default que indique cómo transformarlos:

Python
def converti(obj):
    if isinstance(obj, datetime.datetime):
        return obj.isoformat()
    if isinstance(obj, set):
        return list(obj)
    raise TypeError(f"non serializzabile: {type(obj)}")

json.dumps({"ora": datetime.datetime.now()}, default=converti)

JSON y operaciones con archivos

La biblioteca estándar también proporciona json.dump() y json.load() (sin la 's') para escribir y leer datos JSON directamente desde y hacia archivos, combinándose de forma natural con los gestores de contexto:

Python
with open("data.json", "w") as f:
    json.dump(data, f)

Pruébalo

Ejercicio#python.m8.l1.e1
Intentos: 0Cargando...

Dado `data = {'nome': 'Ada', 'anni': 36}`, serialízalo a JSON con indent=2 y asígnalo a la variable `json_str`. Evalúa `json_str`.

Cargando editor...
Mostrar pista

json.dumps(data, indent=2)

Solución disponible después de 3 intentos

Ejercicio de repaso

Ejercicio#python.m8.l1.e2
Intentos: 0Cargando...

Dada la cadena JSON s = '[{"nome": "a", "v": 1}, {"nome": "b", "v": 2}]', analízala con json.loads en data y calcula la suma de los valores 'v' en total. Evalúa total.

Cargando editor...
Mostrar pista

json.loads devuelve una lista de diccionarios.

Solución disponible después de 3 intentos

Desafío adicional

Ejercicio#python.m8.l1.e3
Intentos: 0Cargando...

Dada la cadena JSON `json_data = '{"name": "Alice", "age": 30}'`, decodifícala en un diccionario Python usando `json.loads`. Extrae el valor asociado a la clave `'name'` y guárdalo en `user_name`. Finalmente, evalúa `user_name`.

Cargando editor...
Mostrar pista

Usa json.loads(json_data) para decodificar, luego accede mediante data['name'].

Solución disponible después de 3 intentos