Lección 09 · 03 Datos del mundo real

JSON: el idioma de las APIs

Casi todo lo que intercambian los programas por internet, incluidas las respuestas de los modelos de IA, viaja en JSON. Y en Python, JSON son diccionarios y listas.

De texto a datos: json.loads

JSON es texto con una forma concreta. json.loads() lo convierte en diccionarios y listas de Python:

import json

texto = '{"cliente": "Acme", "importe": 120.5, "pagada": false, "lineas": ["licencia", "soporte"]}'
factura = json.loads(texto)
print(factura["cliente"], factura["importe"])
print(factura["pagada"])        # false de JSON pasa a False de Python
print(factura["lineas"][1])

import json carga el módulo de la biblioteca estándar. Se escribe una vez, arriba del programa.

De datos a texto: json.dumps

import json

ficha = {"nombre": "Lucía", "intereses": ["IA", "Python"], "acepta_correos": True}
print(json.dumps(ficha, ensure_ascii=False))
print(json.dumps(ficha, ensure_ascii=False, indent=2))

ensure_ascii=False deja las tildes tal cual; indent=2 lo hace legible.

Datos anidados

Se baja nivel a nivel, combinando claves y posiciones:

import json

respuesta = json.loads('{"datos": {"usuarios": [{"email": "[email protected]"}, {"email": "[email protected]"}]}}')
for u in respuesta["datos"]["usuarios"]:
    print(u["email"])
Diferencias que dan guerra: JSON usa true, false y null; Python usa True, False y None. Y en JSON las claves y los textos van siempre con comillas dobles.
// reto 01

Lee una respuesta

Convierte respuesta en datos y guarda en total el número de pedidos de la lista "pedidos". Imprime total.

main.py
Ctrl/⌘ + Enter
¿Atascado? Ver pista

datos = json.loads(respuesta) y después total = len(datos["pedidos"]).

$ python main.py
    // reto 02

    Prepara un JSON

    Crea el diccionario peticion con "modelo": "practica", "temperatura": 0.2 y "mensajes": una lista con el texto "Resume este informe". Guarda en cuerpo el JSON en texto (con json.dumps) e imprímelo.

    main.py
    Ctrl/⌘ + Enter
    ¿Atascado? Ver pista

    Construye el diccionario y luego cuerpo = json.dumps(peticion, ensure_ascii=False).

    $ python main.py
      // reto 03

      Filtra los pendientes

      De la lista de facturas en JSON, guarda en pendientes los id de las que tienen "pagada": false. Imprime la lista.

      main.py
      Ctrl/⌘ + Enter
      ¿Atascado? Ver pista
      for f in json.loads(texto):
          if not f["pagada"]:
              pendientes.append(f["id"])
      $ python main.py