JSON en Python: Guía completa para principiantes sobre manejo, validación y mejores prácticas

1. ¿Qué es JSON? (Conocimientos básicos)

Introducción a JSON

JSON (JavaScript Object Notation) es un formato de datos que se utiliza con frecuencia para la comunicación entre cliente y servidor. Es ligero, fácil de leer y tiene una estructura simple, por lo que se usa ampliamente en aplicaciones web y móviles. JSON está en formato de texto y puede manejarse fácilmente en cualquier lenguaje, lo que le otorga una gran versatilidad.

Estructura básica de JSON

JSON representa los datos mediante pares clave-valor. Por ejemplo, la siguiente estructura muestra un JSON típico:
{
  "名前": "佐藤",
  "年齢": 30,
  "趣味": ["読書", "映画"]
}
En este ejemplo, 名前 es una cadena de texto, 年齢 es un número y 趣味 es un arreglo. Gracias a su simplicidad y legibilidad, el intercambio de datos resulta muy eficiente.

Ventajas de JSON

  1. Ligero y eficiente: Al ser un formato de texto, el consumo de datos es reducido y se disminuye la carga en la red.
  2. Alta compatibilidad: Está soportado en casi todos los lenguajes de programación, lo que permite su uso en múltiples plataformas.
  3. Fácil de analizar: La lectura y escritura de datos es sencilla, especialmente en la comunicación con APIs.

2. Manejo de JSON en Python (Nivel básico)

El módulo json en Python

En Python, se puede leer y escribir datos JSON fácilmente utilizando el módulo json. Por ejemplo, para convertir datos JSON en un diccionario de Python, se usa la función json.loads().
import json

json_data = '{"名前": "佐藤", "年齢": 30}'
python_obj = json.loads(json_data)

print(python_obj)  # {'名前': '佐藤', '年齢': 30}
De manera inversa, para convertir un objeto de Python a formato JSON se utiliza json.dumps().
python_obj = {"名前": "佐藤", "年齢": 30}
json_data = json.dumps(python_obj, ensure_ascii=False)

print(json_data)  # {"名前": "佐藤", "年齢": 30}

Lectura y escritura en archivos

También es posible leer datos JSON desde un archivo o guardarlos en uno nuevo.
# Leer desde archivo
with open('data.json', 'r') as f:
    data = json.load(f)

# Escribir en archivo
with open('data.json', 'w') as f:
    json.dump(python_obj, f, ensure_ascii=False)

3. Comunicación con JSON en Python (Nivel práctico)

Comunicación con APIs usando el módulo requests

Con el módulo requests es sencillo enviar y recibir datos JSON mediante una API. A continuación, un ejemplo de cómo enviar datos con un POST y recibir la respuesta.

Enviar datos JSON con una petición POST

import requests

url = 'https://example.com/api'
data = {'名前': '佐藤', '年齢': 30}

response = requests.post(url, json=data)
json_response = response.json()

print(json_response)

Recibir datos JSON con una petición GET

También se puede obtener JSON de una API mediante una petición GET.
response = requests.get('https://example.com/api/user/1')
data = response.json()

print(data)

4. Manejo de errores y mejores prácticas

Manejo de errores en la comunicación con APIs

Si ocurre un error durante la comunicación con una API, es importante manejar las excepciones adecuadamente. En el siguiente ejemplo se capturan errores de red y de tiempo de espera.
try:
    response = requests.post(url, json=data)
    response.raise_for_status()
except requests.exceptions.HTTPError as errh:
    print("Http Error:", errh)
except requests.exceptions.ConnectionError as errc:
    print("Error Connecting:", errc)
except requests.exceptions.Timeout as errt:
    print("Timeout Error:", errt)
except requests.exceptions.RequestException as err:
    print("OOps: Something Else", err)

Implementación de reintentos

En redes inestables, es útil implementar lógica de reintentos. Con requests se puede hacer utilizando la clase Retry.
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry

session = requests.Session()
retry = Retry(connect=3, backoff_factor=0.5)
adapter = HTTPAdapter(max_retries=retry)
session.mount('http://', adapter)
session.mount('https://', adapter)

response = session.get(url)

5. Validación de JSON

Validación con jsonschema

Para asegurarse de que los datos JSON recibidos cumplen con el formato esperado, se puede usar la librería jsonschema.
from jsonschema import validate, ValidationError

schema = {
    "type": "object",
    "properties": {
        "名前": {"type": "string"},
        "年齢": {"type": "number"}
    },
    "required": ["名前", "年齢"]
}

json_data = {"名前": "佐藤", "年齢": 30}

try:
    validate(instance=json_data, schema=schema)
    print("JSON is valid")
except ValidationError as e:
    print("Validation Error:", e)
Es posible manejar esquemas complejos y objetos anidados, lo que garantiza una validación robusta de los datos provenientes de APIs.

6. Mejores prácticas de seguridad

Gestión de claves API

Se recomienda no incluir claves API directamente en el código fuente, sino gestionarlas mediante variables de entorno. Esto reduce los riesgos de seguridad.
import os

api_key = os.getenv('API_KEY')

Sanitización de datos

Antes de enviar datos introducidos por el usuario al servidor, es importante aplicar sanitización para prevenir ataques como SQL Injection o Cross-Site Scripting (XSS).
from html import escape

safe_data = escape(user_input)
年収訴求