JSON a Python

Genera Python dataclasses desde JSON

Prueba un ejemplo
Nombre de la clase raíz:

Entrada JSON

Salida Python

Se ejecuta localmente · Es seguro pegar secretos
Los Python dataclasses aparecerán aquí…

¿Qué es la conversión de JSON a Python dataclass?

La conversión de JSON a Python dataclass toma un objeto JSON en bruto y genera un conjunto de definiciones de Python dataclass con anotaciones de tipo precisas. El módulo dataclasses de Python, introducido en el PEP 557 (Python 3.7), genera los métodos __init__, __repr__ y __eq__ a partir de los campos anotados de la clase. Cuando trabajas con APIs JSON, archivos de configuración o colas de mensajes, los dataclasses dan a tus datos una estructura tipada que los editores y los verificadores de tipos como mypy pueden validar en tiempo de desarrollo.

El método json.loads() de Python devuelve dicts y listas simples. Funcionan, pero no tienen información de tipos: una clave mal escrita devuelve None en lugar de lanzar un error, y el editor no puede autocompletar los nombres de los campos. Los dataclasses resuelven esto mapeando cada clave JSON a un campo con nombre y tipo. Los objetos JSON anidados se convierten en definiciones de dataclass separadas, los arrays se convierten en anotaciones List[T] y los valores nulos en Optional[T] con un valor por defecto de None.

Escribir estas definiciones a mano es un trabajo mecánico. Hay que leer el JSON, deducir el tipo de cada campo a partir de su valor, convertir las claves de camelCase o snake_case a las convenciones de Python, y gestionar casos extremos como campos anulables y arrays de tipos mixtos. Un conversor hace todo esto en milisegundos. Pegas el JSON, obtienes código de dataclass correcto y puedes seguir adelante.

¿Por qué usar un conversor de JSON a Python?

Traducir estructuras JSON a definiciones de clases Python a mano implica adivinar tipos a partir de datos de ejemplo, reordenar campos para que los obligatorios vayan antes que los opcionales, y actualizar todo cuando cambia la API. Un conversor elimina esa fricción.

Generación instantánea de dataclasses
Pega tu JSON y obtén definiciones tipadas de Python dataclass en menos de un segundo. Los objetos anidados, las listas y los campos opcionales se gestionan automáticamente.
🔒
Procesamiento con privacidad garantizada
La conversión se ejecuta íntegramente en tu navegador con JavaScript. Tu JSON nunca sale de tu máquina. Las claves de API, los tokens y los registros de usuarios se mantienen privados.
📝
Anotaciones de tipo correctas
Cada campo generado incluye una anotación de tipo Python inferida del valor JSON: str, int, float, bool, List[T] u Optional[T] para valores nulos.
📦
Sin instalación ni registro
Abre la página y pega tu JSON. No se necesita un entorno Python, ni paquetes pip que instalar, ni cuenta que crear.

Casos de uso de JSON a Python

Desarrollo de clientes REST API
Genera dataclasses a partir de ejemplos de respuesta de API. Pega el JSON que devuelve un endpoint REST de terceros y obtén clases Python con tipos seguros listas para usar con requests o httpx.
Modelos de solicitud/respuesta en FastAPI
Parte de la forma de un payload JSON y genera definiciones de dataclass. Conviértelas en modelos Pydantic para obtener validación automática en los manejadores de rutas de FastAPI.
Esquemas para pipelines de datos
Define estructuras de registro tipadas para pipelines ETL. Pega un mensaje JSON de ejemplo de Kafka, RabbitMQ o SQS y genera dataclasses que documenten la forma esperada.
Análisis de archivos de configuración
Convierte archivos de configuración JSON en clases Python tipadas. Carga tu configuración con json.load() y luego construye una instancia de dataclass para el autocompletado del editor y la verificación de tipos.
Generación de fixtures para pruebas
Crea fixtures tipadas a partir de datos JSON de ejemplo. Los ingenieros de QA pueden pegar instantáneas de respuestas de API y producir definiciones de dataclass para usar en suites de pruebas con pytest.
Aprendizaje de anotaciones de tipo en Python
Los estudiantes pueden pegar cualquier estructura JSON y ver cómo Python la representa con type hints. El código generado muestra List, Optional, clases anidadas y valores por defecto en contexto.

Mapeo de tipos JSON a Python

Cada valor JSON se mapea a una anotación de tipo Python específica. La tabla siguiente muestra cómo el conversor traduce cada tipo JSON, tanto con la sintaxis del módulo typing (Python 3.7+) como con la sintaxis integrada disponible desde Python 3.10 en adelante.

Tipo JSONEjemploPython (typing)Python 3.10+
string"hello"strstr
number (integer)42intint
number (float)3.14floatfloat
booleantrueboolbool
nullnullOptional[str]str | None
object{"k": "v"}@dataclass classnested model
array of strings["a", "b"]List[str]list[str]
array of objects[{"id": 1}]List[Item]list[Item]
mixed array[1, "a"]List[Any]list[Any]

Referencia del decorador dataclass

El decorador @dataclass acepta varios parámetros que cambian el comportamiento de la clase generada. Esta referencia cubre las opciones más relevantes al trabajar con datos derivados de JSON.

Decorador / CampoComportamientoCuándo usarlo
@dataclassGenerates __init__, __repr__, __eq__ from field annotationsStandard dataclasses
@dataclass(frozen=True)Makes instances immutable (hashable, no attribute reassignment)Config objects, dict keys
@dataclass(slots=True)Uses __slots__ for lower memory and faster attribute accessPython 3.10+, large datasets
@dataclass(kw_only=True)All fields require keyword arguments in __init__Python 3.10+, many fields
field(default_factory=list)Sets a mutable default without sharing state between instancesList/dict/set defaults

dataclass vs Pydantic vs TypedDict

Python tiene tres formas habituales de definir estructuras tipadas a partir de JSON. Cada una encaja en un caso de uso diferente. Los dataclasses son la opción de la biblioteca estándar sin dependencias externas. Pydantic añade validación en tiempo de ejecución. TypedDict anota dicts simples sin crear una clase nueva.

@dataclass
Biblioteca estándar (Python 3.7+). Genera __init__, __repr__ y __eq__. Sin validación en tiempo de ejecución. Funciona con mypy y dataclasses-json para la serialización. La mejor opción para estructuras de datos internas donde controlas la entrada.
BaseModel (Pydantic)
Biblioteca de terceros. Valida tipos y restricciones en tiempo de ejecución. Analiza JSON directamente mediante model_validate_json(). Opción estándar para FastAPI, gestión de configuración y cualquier código que reciba entradas no confiables.
TypedDict
Biblioteca estándar (Python 3.8+). Añade type hints a dicts normales. No genera __init__ ni métodos. Los valores siguen siendo accesibles como dict. Úsalo cuando necesites verificación de tipos pero quieras mantener la interfaz de dict, como en bases de código heredadas.

Ejemplos de código

Estos ejemplos muestran cómo usar los dataclasses generados en Python, cómo producirlos mediante programación desde JavaScript y cómo usar alternativas como Pydantic y herramientas CLI.

Python (dataclasses)
from dataclasses import dataclass
from typing import List, Optional
import json

@dataclass
class Address:
    street: str
    city: str
    zip: str

@dataclass
class User:
    id: int
    name: str
    email: str
    active: bool
    score: float
    address: Address
    tags: List[str]
    metadata: Optional[str] = None

raw = '{"id":1,"name":"Alice","email":"alice@example.com","active":true,"score":98.5,"address":{"street":"123 Main St","city":"Springfield","zip":"12345"},"tags":["admin","user"],"metadata":null}'
data = json.loads(raw)

# Reconstruct nested objects manually
addr = Address(**data["address"])
user = User(**{**data, "address": addr})
print(user.name)     # -> Alice
print(user.address)  # -> Address(street='123 Main St', city='Springfield', zip='12345')
JavaScript (generate Python from JSON)
// Minimal JSON-to-Python-dataclass generator in JS
function jsonToPython(obj, name = "Root") {
  const classes = [];
  function infer(val, fieldName) {
    if (val === null) return "Optional[str]";
    if (typeof val === "string") return "str";
    if (typeof val === "number") return Number.isInteger(val) ? "int" : "float";
    if (typeof val === "boolean") return "bool";
    if (Array.isArray(val)) {
      const first = val.find(v => v !== null);
      return first ? `List[${infer(first, fieldName + "Item")}]` : "List[Any]";
    }
    if (typeof val === "object") {
      const clsName = fieldName.charAt(0).toUpperCase() + fieldName.slice(1);
      build(val, clsName);
      return clsName;
    }
    return "Any";
  }
  function build(obj, cls) {
    const fields = Object.entries(obj).map(([k, v]) => `    ${k}: ${infer(v, k)}`);
    classes.push(`@dataclass\nclass ${cls}:\n${fields.join("\n")}`);
  }
  build(obj, name);
  return classes.join("\n\n");
}

const data = { id: 1, name: "Alice", scores: [98, 85] };
console.log(jsonToPython(data, "User"));
// @dataclass
// class User:
//     id: int
//     name: str
//     scores: List[int]
Python (Pydantic BaseModel alternative)
from pydantic import BaseModel
from typing import List, Optional

class Address(BaseModel):
    street: str
    city: str
    zip: str

class User(BaseModel):
    id: int
    name: str
    email: str
    active: bool
    score: float
    address: Address
    tags: List[str]
    metadata: Optional[str] = None

# Pydantic parses and validates JSON in one step
raw = '{"id":1,"name":"Alice","email":"alice@example.com","active":true,"score":98.5,"address":{"street":"123 Main St","city":"Springfield","zip":"12345"},"tags":["admin","user"],"metadata":null}'
user = User.model_validate_json(raw)
print(user.name)              # -> Alice
print(user.model_dump_json()) # -> re-serializes to JSON
CLI (datamodel-code-generator)
# Install the generator
pip install datamodel-code-generator

# Generate dataclasses from a JSON file
datamodel-codegen --input data.json --output models.py --output-model-type dataclasses.dataclass

# Generate Pydantic models instead
datamodel-codegen --input data.json --output models.py

# From a JSON string via stdin
echo '{"id": 1, "name": "Alice", "tags": ["admin"]}' | \
  datamodel-codegen --output-model-type dataclasses.dataclass
# Output:
# @dataclass
# class Model:
#     id: int
#     name: str
#     tags: List[str]

Preguntas frecuentes

¿Cuál es la diferencia entre un Python dataclass y una clase normal?
Un dataclass usa el decorador @dataclass para generar automáticamente los métodos __init__, __repr__ y __eq__ a partir de las anotaciones de campo. Una clase normal requiere que escribas estos métodos tú mismo. Los dataclasses reducen el boilerplate cuando la clase almacena principalmente datos, que es el caso habitual en estructuras derivadas de JSON.
¿Puedo usar dataclasses con serialización JSON directamente?
El módulo json de la biblioteca estándar no puede serializar instancias de dataclass por defecto. Usa dataclasses.asdict() para convertir un dataclass a un dict y luego pasa ese dict a json.dumps(). Para más control, la librería dataclasses-json añade los métodos .to_json() y .from_json(), y los modelos Pydantic gestionan la serialización de forma nativa.
¿Cómo gestiona el conversor los objetos JSON anidados?
Cada objeto anidado se convierte en una definición @dataclass separada. Si un campo JSON llamado "address" contiene un objeto con "street" y "city", el conversor crea un dataclass Address y anota el campo del padre como address: Address. Las estructuras profundamente anidadas producen múltiples definiciones de dataclass en orden de dependencia.
¿Qué ocurre cuando un campo JSON es null?
Los campos nulos se anotan como Optional[str] (o el tipo apropiado si puede inferirse del contexto) con un valor por defecto de None. Los campos con valores por defecto deben ir después de los campos obligatorios en un dataclass, por lo que el conversor coloca los campos opcionales al final de la definición de la clase.
¿Hay diferencia entre dataclasses y modelos Pydantic para JSON?
Los dataclasses forman parte de la biblioteca estándar y no validan datos en tiempo de ejecución. Los modelos Pydantic validan tipos, aplican restricciones y pueden analizar cadenas JSON en bruto directamente. Si recibes JSON de fuentes externas y necesitas rechazar datos mal formados, Pydantic es la mejor opción. Para el paso de datos interno donde confías en la entrada, los dataclasses son más ligeros y no tienen dependencias externas.
¿Cómo manejo las claves JSON en camelCase en Python dataclasses?
La convención de Python usa snake_case para los nombres de variables. El conversor traduce claves en camelCase como "firstName" a campos en snake_case como first_name. Si necesitas deserializar de vuelta desde JSON, usa la librería dataclasses-json con una configuración que mapee entre las dos convenciones de nomenclatura, o escribe un método __post_init__ personalizado.
¿Este conversor admite la sintaxis de Python 3.10+ como list[str] en lugar de List[str]?
El conversor genera importaciones del módulo typing (List, Optional) para máxima compatibilidad con Python 3.7 a 3.12. Si tu proyecto apunta a Python 3.10 o superior, puedes reemplazar List[str] por list[str] y Optional[str] por str | None sin problema. La tabla de mapeo de tipos que aparece más arriba muestra ambas formas.