logo
GeekFormat

JSON a Python

Herramienta online gratuita de JSON a Python que convierte automáticamente datos JSON en clases @dataclass Python con anotaciones de tipo. Las cadenas se mapean a str, enteros a int, flotantes a float, booleanos a bool, arrays a List[T], objetos anidados se convierten en dataclasses separadas y null se mapea a Optional[Any]. Se ejecuta localmente en tu navegador; copia con un clic o descarga model.py. El código generado es compatible con la biblioteca estándar dataclasses de Python 3.7+ y puede ser consumido directamente por frameworks Python populares como FastAPI, Django REST framework, marshmallow y cattrs, o usado como estructuras de datos fuertemente tipadas en Jupyter Notebook.

Relacionado

Acerca de JSON a Python: Convirtiendo datos JSON en modelos dataclass ejecutables

JSON a Python es el proceso de convertir datos en formato JSON (objetos o arrays) en definiciones de tipo dataclass Python. Python es uno de los lenguajes de programación de propósito general más populares hoy en día, ampliamente usado para backends web (FastAPI / Django / Flask), ciencia de datos (pandas / scikit-learn), web scraping, scripts DevOps, machine learning, pruebas automatizadas y más. En desarrollo, a menudo necesitas convertir muestras JSON de documentación API o respuestas reales a tipos Python; escribir clases a mano no solo es repetitivo sino propenso a tipos de campo incorrectos, y esta herramienta tiene como objetivo automatizar ese proceso.

dataclass es una característica de biblioteca estándar introducida en Python 3.7 (PEP 557), generando automáticamente métodos mágicos como __init__, __repr__, __eq__ vía el decorador @dataclass, reduciendo definiciones de clases de datos de una docena de líneas de código repetitivo a unas pocas líneas de declaraciones de campos. Esta herramienta se ejecuta localmente en el navegador basada en quicktype-core, usando opciones de renderizado just-types y no-comments para generar código dataclass limpio para Python. La salida incluye importaciones necesarias como from dataclasses import dataclass y from typing import Any, List, Optional, utilizables directamente con proyectos Python 3.7+.

La inferencia de tipos es el núcleo de JSON a Python. La herramienta mapea tipos primitivos JSON a tipos estándar Python: cadenas a str, enteros a int, flotantes a float, booleanos a bool, arrays a List[T] (elementos inferidos del primer elemento), objetos anidados a @dataclass separadas, valores null a Optional[Any]. Para objetos anidados, la herramienta crea automáticamente nuevas dataclasses para cada nivel, nombradas capitalizando nombres de campo en PascalCase, ej., un campo address genera una clase Address, objetos en arrays items generan una clase Item.

A diferencia de algunas herramientas online que requieren subir JSON a servidores para procesamiento, todos los cálculos para esta herramienta ocurren en tu navegador. quicktype-core se carga y ejecuta vía Web Worker; análisis JSON, inferencia de tipos, generación de código Python y descargas de archivos ocurren todo localmente, sin datos enviados a ningún servidor. Esto es especialmente importante para JSON que contiene claves API, campos de privacidad de usuario o estructuras de negocio no publicadas; los datos se borran de memoria cuando cierras la página.

El código generado puede colocarse directamente en proyectos Python para su uso. dataclass es una biblioteca estándar que no requiere instalación extra; el módulo typing está disponible desde Python 3.5 en adelante. Si usas Python 3.9+, puedes reemplazar manualmente List[str] con list[str] integrado, Optional[str] con str | None para sintaxis de anotación de tipo más moderna. Si tu proyecto usa Pydantic para validación de datos (como FastAPI), simplemente cambia @dataclass por class Xxx(BaseModel): para cambiar sin problemas a modelos Pydantic.

Ten en cuenta que el código autogenerado es un punto de partida, no un punto final. La herramienta infiere tipos de muestras JSON y no puede determinar tipos de negocio precisos (ej., tipos semánticos como URL, Email, ID son todos uniformemente inferidos como str). Para campos JSON snake_case, los campos dataclass Python se generan tal cual; puede que necesites cambiar manualmente nombres de campo a snake_case o configurar mapeo vía alias_generator de Pydantic. Recomendamos usar el resultado generado como primer borrador, luego ajustar finamente nombres de campo, tipos, valores por defecto y lógica de validación según convenciones del proyecto.

Otra dimensión de comparación digna de mención es dataclass vs Pydantic BaseModel vs attrs vs TypedDict. dataclass es biblioteca estándar Python, cero dependencias, modelado de datos puro, sin validación en tiempo de ejecución, adecuada para objetos de transferencia de datos (DTO) internos y modelos ORM. Pydantic BaseModel añade validación impulsada por tipos, serialización y gestión de configuraciones sobre dataclass, y es la capa de modelo de datos predeterminada de FastAPI. attrs es el predecesor de dataclass, ofreciendo más opciones de configuración (slots, validators, converters). TypedDict es una solución ligera del módulo typing, solo proporcionando sugerencias de tipo sin restricciones en tiempo de ejecución, adecuada para escenarios compatibles con dict. Esta herramienta genera dataclass por defecto, que puede reemplazarse con cualquiera de las formas anteriores en tu editor con un clic.

Comparado con herramientas online como Java a JSON / TypeScript a JSON, JSON a Python tiene valor único en el ecosistema de ciencia de datos. Funciones pandas como read_json, DataFrame.from_records, json_normalize a menudo toman listas de objetos tipo diccionario; Pipeline.fit de scikit-learn acepta estructuras de datos con restricciones de campo; usar dataclass para envolver respuestas JSON en Jupyter Notebook durante análisis exploratorio mejora significativamente la legibilidad del código. El código generado por esta herramienta se integra perfectamente con estos ecosistemas, usando muestras JSON como única fuente de verdad.

Hay más herramientas alternativas para conversión JSON ↔ dataclass en el ecosistema Python: marshmallow (centrado en validación de serialización/deserialización), cattrs (biblioteca de conversión estructurada), pydantic (validación en tiempo de ejecución + sugerencias IDE), apischema (genera JSON Schema sin decorador dataclass). Las dataclasses puras generadas por esta herramienta son entradas naturales para estas bibliotecas: después de copiar la clase generada, usuarios de marshmallow pueden añadir Schema(Model), usuarios de cattrs pueden usar cattrs.structure(data, Model) para completar la conversión. Recomendamos usar esta herramienta como punto de partida para generación de tipos, luego superponer bibliotecas de ecosistema apropiadas según arquitectura del proyecto.

En escenarios CLI y automatización, JSON a Python también tiene valor único. Después de que argparse analiza argumentos de línea de comandos, usualmente necesitan envoltura secundaria en dicts antes de pasar a funciones de negocio; reemplazar dicts con dataclasses generadas hace los scripts más robustos. Similarmente, envolver archivos de configuración (config.json / settings.json) con dataclass permite a colegas DevOps ver directamente significados y tipos de campo en su IDE, detectando errores de configuración temprano con mypy en CI.

Un detalle a menudo pasado por alto es el equilibrio entre rendimiento y mantenibilidad. Las dataclasses generadas por esta herramienta son el mejor vehículo para instantáneas inmutables: añadir (frozen=True) hace las instancias no modificables y seguras para compartir multi-hilo; añadir (slots=True) (Python 3.10+) reduce el uso de memoria en aproximadamente 40%. Para evitar la trampa de compartir la misma lista vacía para campos List[str] generados, debes usar field(default_factory=list) en lugar de = [], y el código generado por esta herramienta ya sigue esta mejor práctica.

Casos de uso

  • Integración REST API: Convierte respuestas JSON del backend a @dataclass Python, usa con requests + json para análisis de peticiones HTTP fuertemente tipado. Con mypy o pyright, obtén autocompletado de atributos en tiempo real y comprobación de tipos en tu IDE para evitar errores de escritura comunes.
  • Modelos petición/respuesta FastAPI: Convierte JSON de ejemplo de documentación de interfaz API en plantillas Pydantic BaseModel para unificar definiciones de modelo frontend y backend. Recomendamos habilitar el parámetro response_model en proyectos FastAPI para que la documentación OpenAPI genere automáticamente ejemplos de campo y reglas de validación.
  • Serializadores Django Ninja / DRF: Convierte respuestas JSON a dataclass, luego añade manualmente ModelSerializer de DRF o clases derivadas Schema de Ninja. ModelSerializer de DRF puede autogenerar reglas de validación basadas en dataclass; Schema de Ninja también puede reutilizar directamente la salida de esta herramienta.
  • Modelado de datos de web scraping: Convierte datos JSON extraídos de páginas web a dataclass para evitar omisiones de campo y errores de escritura causados por acceso dinámico a dict. Cuando se usa con bibliotecas de scraping asíncrono como requests-html, playwright, dataclass también reduce código repetitivo para deserialización JSON.
  • Definición de características de machine learning: Convierte esquemas JSON para datos de entrenamiento scikit-learn / pandas a dataclass para estandarizar nombres y tipos de campos de características. sklearn Pipeline.fit(X, y) acepta estructuras de datos con anotaciones de tipo; dataclass + asdict es un puente eficiente para convertir hacia/desde pandas DataFrames.
  • Deserialización de archivos de configuración: Convierte ejemplos de archivos de configuración YAML/JSON a dataclass, usa con Hydra / OmegaConf para lectura de configuración fuertemente tipada. Con la decoración @dataclass de Hydra, las configuraciones disfrutan de autocompletado en tu IDE, evitando errores de escritura comunes e inconsistencias de tipo en configuraciones YAML.
  • Estructuras temporales Jupyter Notebook: Convierte muestras JSON de análisis de datos exploratorio a dataclass para fácil acceso a atributos y autocompletado IDE en Notebooks. Envolver respuestas JSON con dataclass en Notebooks mejora significativamente la legibilidad del código de análisis exploratorio, haciendo más fácil la refactorización posterior en módulos de producción.
  • Definición de interfaz de microservicios: Convierte JSON de ejemplo de cuerpos de petición para servicios gRPC/HTTP a tipos Python para unificar definiciones de modelo del lado del servidor compartidas entre equipos. Después de convertir protobuf gRPC a JSON, convertir a dataclass sirve como modelo fuertemente tipado para servicios backend, alineado con tipos TypeScript del frontend.
  • Desarrollo de herramientas CLI: Convierte ejemplos JSON de configuración CLI a dataclass, usa con argparse para deserialización y validación de configuración. Convertir argparse Namespace a dataclass solo requiere una línea: dataclass(**vars(args)), que es más seguro que lógica de análisis escrita a mano.
  • Construcción de datos de prueba: Convierte fixtures JSON reales devueltos por el backend a tipos Python, usa dataclasses.replace para conducción de datos de prueba en pytest. El decorador parametrize de pytest combinado con dataclass construye fixtures de prueba tipados con mensajes de fallo más claros.
  • Análisis estructurado de logs: Convierte logs JSON capturados por ELK / Loki a dataclass para fácil filtrado y reglas de alerta. Después de envolver logs JSON ELK con dataclass, puedes hacer filtrado de campos preciso y consultas de agregación, más seguro que acceso a dict.
  • Migración de centro de configuración: Convierte configuraciones JSON de Apollo / Nacos / Consul a tipos Python para recarga en caliente de configuración del lado del servidor. Las configuraciones JSON Apollo / Nacos pueden ser validadas bidireccionalmente con dataclass, detectando inmediatamente campos faltantes, desajustes de tipo y otros problemas en cambios de configuración.
  • Colaboración entre lenguajes: Al integrar backend Python con frontend TypeScript, convierte el mismo JSON a dataclass Python e interfaz TS respectivamente para mantener ambos lados consistentes. En escenarios de colaboración entre lenguajes, backend Python + frontend TS comparten la misma muestra JSON, generando dataclass e interfaz respectivamente para mantener nombres de campo consistentes.
  • Migración de base de datos: Convierte documentos JSON exportados de campos MongoDB / PostgreSQL JSONB a modelos Python como referencia para definiciones de entidad ORM. Convertir exportaciones de documentos MongoDB JSONB a dataclass sirve como referencia de campo para entidades ORM, más fácil de mantener que leer documentos MongoDB directamente.
  • Blockchain/Web3: Convierte respuestas JSON RPC en cadena a dataclass Python para envoltura de tipos en SDKs como web3.py. SDKs de Ethereum como web3.py, eth-brownie todos soportan valores de retorno estilo dataclass, convenientes para envoltura secundaria.
  • ETL ciencia de datos: Convierte fuentes de datos JSON ascendentes a dataclass, luego usa pandas DataFrame.from_records para convertir a tablas para análisis descendente. pandas DataFrame.from_records([asdict(d) for d in dataclass_list]) convierte estructuras anidadas a tablas en una línea.
  • Validación de Schema OpenAPI: Convierte JSON de ejemplo de documentación OpenAPI a modelos Python, luego escribe lógica de validación Pydantic. Los campos de ejemplo OpenAPI pueden copiarse directamente a la entrada de esta herramienta; los modelos Pydantic generados validan automáticamente la consistencia de documentación API.
  • Ejemplos de enseñanza: Convierte JSON de ejemplo a dataclass en cursos Python para explicar conceptos como el módulo typing, anotaciones de tipo, generación automática __init__, etc. Al explicar conceptos como módulo typing, generación automática __init__, slots en cursos Python, dataclass es el vehículo de demostración más intuitivo.
  • Conversión de nombres de campo: Convierte respuestas API JSON snake_case a dataclass, luego cambia manualmente nombres de campo o usa alias_generator de Pydantic para mapeo de campos. El alias_generator de Pydantic puede configurarse en BaseModel para mapeo automático camelCase ↔ snake_case, evitando alias escritos a mano.

Cómo Usar

  1. Pega contenido JSON en el editor izquierdo, o haz clic en el botón de subida para seleccionar un archivo .json / .txt
  2. Espera 400ms para auto-conversión; el código dataclass Python generado aparecerá a la derecha
  3. Si el JSON está malformado, haz clic en el botón "Reparar JSON" para autoreparar problemas de sintaxis comunes
  4. Haz clic en "Copiar" para pegar en el directorio models/ de tu proyecto, o haz clic en "Descargar" para guardar como archivo model.py

Características

  • Conversión local en navegador: El análisis JSON y generación de código Python ocurren completamente en tu navegador; los datos de entrada nunca se suben a ningún servidor, por lo que las respuestas API sensibles son seguras de usar
  • Salida anotada con dataclass: Genera clases Python estándar decoradas con @dataclass, utilizables directamente en proyectos Python 3.7+ con from __future__ import annotations
  • Inferencia automática de tipos: str / int / float / bool / List[T] / Dict[str, Any] / Optional[Any] se mapean automáticamente desde valores JSON sin especificación manual de tipos de campo
  • División automática de objetos anidados: Los objetos JSON anidados generan clases @dataclass separadas nombradas con nombres de campo en PascalCase (ej., address -> Address), evitando definiciones de tipo duplicadas
  • Expansión automática de genéricos List: Los arrays JSON se convierten automáticamente a List[T], con tipos de elemento inferidos desde el primer elemento no-nulo del array, ej., ["a","b"] -> List[str], [{...},{...}] -> List[Item]
  • Campos opcionales: Los campos null generan Optional[Any] como respaldo, asegurando que las anotaciones de tipo expresen correctamente campos potencialmente faltantes
  • Auto-conversión con debounce de 400ms: La conversión se activa automáticamente después de pegar, con vista previa de código Python en tiempo real a la derecha para reducir esperas y clics adicionales
  • Reparación de errores JSON con un clic: Repara automáticamente errores de formato comunes como comas finales, comillas simples, comillas faltantes, luego continúa generando código una vez reparado
  • Copiar y descargar: Copia todo el código Python con un clic, o descarga como archivo model.py para colocar directamente en la raíz de tu proyecto o submódulo models
  • Historial de entrada localStorage: Guarda automáticamente entradas recientes localmente, para que puedas reanudar edición rápidamente después de refrescar o cerrar accidentalmente la página
  • Edición de panel dividido responsivo: Ingresa JSON a la izquierda, ve código Python a la derecha; soporta arrastrar para redimensionar anchos de panel, adaptado para pantallas grandes y móviles
  • Soporta adaptación secundaria a Pydantic / attrs / TypedDict: Las dataclasses generadas pueden tener decoradores BaseModel o attrs añadidos con un clic para adaptarse a FastAPI, Django Ninja, pydantic-settings y otros frameworks

Ejemplos de Código

Python: Analizar respuestas API a dataclass generada con requests

python
# requirements.txt
# requests>=2.31

from dataclasses import dataclass
from typing import Any, List, Optional
import json
import requests


@dataclass
class Address:
    city: str
    zip: str


@dataclass
class User:
    id: int
    name: str
    active: bool
    address: Address
    tags: List[str]
    label: Optional[Any] = None


def main() -> None:
    resp = requests.get("https://api.example.com/users/1", timeout=10)
    resp.raise_for_status()

    # Directly deserialize JSON string to dataclass instance
    user: User = User(**resp.json())

    # Strongly typed access: IDE completion, mypy/pyright static checking
    print(f"{user.name} lives in {user.address.city}")
    print(f"tags: {user.tags}")


if __name__ == "__main__":
    main()

Python: Validación cuerpo petición FastAPI con modelos generados (adaptado Pydantic)

python
# pip install fastapi 'pydantic>=2'

from typing import List, Optional
from fastapi import FastAPI
from pydantic import BaseModel


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


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


app = FastAPI()


@app.post("/users")
async def create_user(user: User) -> dict:
    # FastAPI automatically validates request body with User; field type/required errors return 422
    return {"id": user.id, "name": user.name}


@app.get("/users/{user_id}", response_model=User)
async def get_user(user_id: int) -> User:
    # response_model auto-serializes response; OpenAPI docs auto-generated
    return User(
        id=user_id,
        name="Alice",
        email="alice@example.com",
        active=True,
        address=Address(city="Beijing", zip="100000"),
        tags=["fastapi", "pydantic"],
    )

Python: Modelado de datos de web scraping (dataclass + deserialización JSON)

python
from dataclasses import dataclass, asdict
from typing import List, Optional
import json


@dataclass
class Author:
    id: int
    name: str


@dataclass
class Article:
    id: int
    title: str
    url: str
    author: Author
    score: int
    tags: List[str]
    summary: Optional[str] = None


def parse_articles(raw_json: str) -> List[Article]:
    """Deserialize scraped JSON string into list of Articles."""
    payloads = json.loads(raw_json)
    return [Article(**payload) for payload in payloads]


if __name__ == "__main__":
    raw = '''[
        {
            "id": 1,
            "title": "Hello dataclass",
            "url": "https://example.com/p/1",
            "author": {"id": 10, "name": "Alice"},
            "score": 95,
            "tags": ["python", "typing"],
            "summary": "quick intro"
        }
    ]'''

    articles = parse_articles(raw)
    for art in articles:
        # IDE autocompletes author.name, tags, summary
        print(f"[{art.score}] {art.title} - {art.author.name}")
        print(f"  tags: {art.tags}")

        # Use asdict when dict form is needed (e.g., writing to MongoDB)
        doc = asdict(art)
        print(f"  mongo doc: {doc}")

Python: Definición de características de machine learning (integración pandas + sklearn)

python
# pip install pandas scikit-learn

from dataclasses import dataclass, field, asdict
from typing import List, Optional
import json
import pandas as pd
from sklearn.ensemble import RandomForestClassifier


@dataclass
class FeatureSchema:
    """Sample feature schema, fine-tuned after generation by JSON to Python tool."""
    user_id: int
    age: int
    city: str
    plan: str
    monthly_spend: float
    active: bool
    tags: List[str] = field(default_factory=list)
    last_login: Optional[str] = None


def features_to_frame(samples: List[dict]) -> pd.DataFrame:
    """Convert JSON list to DataFrame, automatically using dataclass field names as column names."""
    rows = [asdict(FeatureSchema(**row)) for row in samples]
    df = pd.DataFrame(rows)
    # One-hot encode categorical fields
    df = pd.get_dummies(df, columns=["city", "plan"], drop_first=True)
    return df


def main() -> None:
    raw = json.loads('''[
        {"user_id": 1, "age": 25, "city": "Beijing", "plan": "pro", "monthly_spend": 99.0, "active": true, "tags": ["new"]},
        {"user_id": 2, "age": 40, "city": "Shanghai", "plan": "free", "monthly_spend": 0.0, "active": false, "tags": []}
    ]''')

    X = features_to_frame(raw)
    y = [1, 0]  # Assume labels: paying user / free user

    model = RandomForestClassifier(n_estimators=100, random_state=42)
    model.fit(X, y)

    print("feature_columns:", list(X.columns))
    print("importances:", dict(zip(X.columns, model.feature_importances_)))

Best Practices

Las muestras JSON deben incluir valores de ejemplo de campos completos siempre que sea posible

La herramienta infiere tipos de muestras JSON; si un campo es siempre null en muestras, caerá a Optional[Any]. Recomendamos proporcionar un valor de ejemplo para todos los campos clave antes de la generación (ej., "description": "sample" infiere str, "count": 0 infiere int), luego elimina valores de ejemplo después de la generación para obtener tipos precisos.

Para JSON complejo, prefiere dividir en múltiples dataclasses

Esta herramienta por defecto expande recursivamente objetos anidados en clases separadas, pero cuando un solo archivo tiene más de 50 campos, recomendamos dividir manualmente en submódulos como models/user.py, models/order.py. Esto tiene tres beneficios: ① Compilación más rápida; ② División de trabajo más clara entre miembros del equipo; ③ Manejo más fácil de referencias circulares.

Cambia a Pydantic BaseModel cuando se necesite validación en tiempo de ejecución

Si tu proyecto usa FastAPI o requiere validación estricta de cuerpo de petición, recomendamos adaptar inmediatamente a BaseModel después de generar dataclass: cambia @dataclass por class Xxx(BaseModel):, cambia from dataclasses import dataclass por from pydantic import BaseModel, deja otros tipos de campo sin cambios. Después de que Pydantic v2 fue reescrito en Rust, su rendimiento de validación es incluso más rápido que dataclass.

Usa mypy para comprobación de tipos en CI

Añade el comando mypy src/ --strict a tu pipeline CI para detectar errores de escritura de campos, inconsistencias de tipo, mal uso de Optional y otros problemas. Las dataclasses generadas por esta herramienta cumplen totalmente con las especificaciones PEP 484 y pasan mypy con cero advertencias. Combinado con un hook pre-commit, los desarrolladores pueden comprobar automáticamente antes de hacer commit.

Evita valores por defecto mutables en campos dataclass

tags: List[str] = [] es un error común que causa que todas las instancias compartan la misma lista vacía. El código generado por esta herramienta ya maneja esto con field(default_factory=list), pero siempre sigue esta regla al añadir manualmente nuevos campos después de la generación. El sistema de tipos de Python retrasa exponer este error a tiempo de ejecución, y los comprobadores estáticos pueden no detectarlo tampoco.

model.py descargado recomendado colocarse en un paquete models separado

Estructura de directorios recomendada: src/models/__init__.py + src/models/user.py + src/models/order.py. Esto: ① Simplifica importaciones para código de negocio con from models import User; ② El equipo puede reclamar diferentes dataclasses por módulo; ③ Los fixtures pytest pueden importarse uniformemente en conftest.py.

JSON sensible debe procesarse localmente

Si JSON contiene información sensible como claves API, tokens, estructuras de negocio no publicadas o especificaciones de producto sin publicar, siempre usa esta herramienta (se ejecuta localmente en navegador) en lugar de herramientas online que requieren subidas. Esta herramienta no envía datos a ningún servidor; todo el contenido JSON en memoria se borra cuando cierras la página.

Habilita slots en Python 3.10+ para ahorrar memoria

Si necesitas instanciar muchas dataclasses (ej., modelado de millones de puntos de datos en web scraping), recomendamos Python 3.10+ con @dataclass(slots=True) habilitado. Después de habilitar, las instancias ya no usan __dict__, reduciendo el uso de memoria en 30-40% y mejorando la velocidad de acceso a atributos en aproximadamente 20%. El código generado por esta herramienta no habilita esto por defecto; puedes añadir manualmente slots=True después de la generación.

Preguntas Frecuentes

¿Cómo convierto JSON a una dataclass Python?

Pega contenido JSON en el editor izquierdo, o haz clic en el botón de subida para seleccionar un archivo .json / .txt. La herramienta llama automáticamente a quicktype-core en 400ms para generar código Python, mostrando definiciones de clase decoradas con @dataclass a la derecha. Si el JSON está malformado, haz clic en el botón "Reparar JSON" para autoreparar antes de convertir. Si la conversión no se activa automáticamente en 400ms, haz clic manualmente en el botón Convertir en la barra de herramientas.

¿El código Python generado incluye anotaciones dataclass?

Sí. La herramienta usa el modo de renderizado just-types de quicktype-core para generar decoradores @dataclass, from dataclasses import dataclass e importaciones necesarias como from typing import Any, List, Optional para Python, utilizables directamente con dataclasses de la biblioteca estándar Python 3.7+. Si no necesitas dataclass, puedes eliminar manualmente el decorador y las sentencias de importación y reescribir como una clase simple. Para tipos más agresivos (como Decimal, UUID, datetime), recomendamos usarlo con Pydantic BaseModel.

¿Qué estructuras de datos JSON son soportadas?

Todas las estructuras JSON válidas son soportadas: tipos primitivos (null, boolean, number, string), arrays (1D o multidimensionales), objetos anidados (cualquier profundidad). Los objetos JSON generan una dataclass raíz; los arrays JSON generan un contenedor raíz de tipo List[RootClass]. Valores no-JSON como literales de objeto JavaScript, funciones, Symbols y undefined no son soportados. quicktype-core también soporta JSON Schema, ejemplos JSON y entradas TypeScript como fuentes de tipo.

¿Cómo se mapean los tipos de campo JSON a tipos Python?

Las cadenas se mapean a str, enteros a int, flotantes a float, booleanos a bool, arrays a List[T] (tipo de elemento inferido del primer elemento), objetos anidados a @dataclass separadas, null a Optional[Any]. Consulta la "Tabla de referencia de mapeo de tipos JSON a tipos Python" abajo para reglas de mapeo específicas. Python 3.9+ puede usar sintaxis integrada list[str], dict[str, Any] sin importar desde el módulo typing.

¿Qué tipo generan los valores null?

Los valores null en JSON generan Optional[Any], indicando que el campo puede faltar o tener un tipo incierto. Si ya conoces el tipo real del campo, puedes proporcionar un valor de ejemplo en el JSON fuente (ej., "field": "" infiere str), luego cámbialo a un tipo más preciso como Optional[str] después de la generación según necesidades del negocio. Si hay muchos campos null en tu JSON, reemplázalos con valores de ejemplo (como cadena vacía, 0, false) en los datos fuente para resultados de inferencia más precisos.

¿Los arrays se convierten a List?

Sí. Los arrays JSON se convierten uniformemente a genéricos Python List[T], con tipos de elemento inferidos automáticamente desde el primer elemento del array. Por ejemplo, ["a","b"] genera List[str], [1,2,3] genera List[int], [{...},{...}] genera List[Item]. Los arrays vacíos [] por defecto son List[Any]. Los arrays multidimensionales se expanden recursivamente a List[List[T]], ej., [[1,2],[3,4]] se convierte en List[List[int]].

¿Cómo se manejan los objetos anidados?

Cada objeto anidado genera una clase @dataclass separada, nombrada capitalizando la primera letra del nombre del campo. Por ejemplo, si el objeto raíz contiene un campo address, se generan ambas dataclasses Root y Address, referenciadas en Root vía address: Address. Objetos con la misma estructura reutilizan el mismo tipo para evitar definiciones duplicadas. Objetos de misma estructura se fusionan en una clase @dataclass para evitar duplicación; si necesitas dividirlos, copia manualmente en múltiples clases después de la generación.

¿Puedo personalizar el nombre de clase generado?

quicktype-core por defecto usa el nombre de fuente JSON (como User) como nombre de clase raíz. Puedes modificar manualmente nombres de clase y ubicaciones de referencia después de la generación. El nombre de archivo model.py descargado también puede renombrarse según sea necesario al guardar. El nombre de clase raíz por defecto es JsonRootClass; puedes usar la función Renombrar de tu IDE después de la generación para renombrar por lotes a nombres semánticos de negocio (como User, Order).

¿El código generado puede usarse directamente en un proyecto?

Sí, puede usarse directamente, pero asegura un entorno Python 3.7+ (dataclasses es biblioteca estándar 3.7). El código depende del módulo typing, disponible en Python 3.5+. Para genéricos integrados más concisos list[str], dict[str, Any] en Python 3.9+, reemplaza manualmente tipos importados como List[str]. Si usas gestores de paquetes modernos como uv, poetry, pdm, la declaración de dependencias puede diferir ligeramente, pero dataclass en sí no requiere dependencias extra.

¿Puedo convertir a Pydantic BaseModel en lugar de dataclass?

La herramienta genera @dataclass por defecto. Si necesitas Pydantic BaseModel para validación de cuerpo de petición FastAPI, puedes: ① Cambiar from dataclasses import dataclass por from pydantic import BaseModel; ② Cambiar @dataclass por class Xxx(BaseModel):; ③ Cambiar Optional[Any] por Optional[tipo específico] o dejar como predeterminado. Pydantic v2 también soporta heredar directamente de dataclass. Pydantic v2 también soporta estilo dataclass: puedes añadir directamente el decorador @dataclass a una dataclass y pasarla a FastAPI sin heredar BaseModel.

¿Cuáles son los pasos completos para generar un modelo de cuerpo de petición FastAPI?

FastAPI recomienda Pydantic BaseModel. Después de generar una dataclass, reescribe en tres pasos: ① Cambia @dataclass por class Xxx(BaseModel):; ② Elimina la importación dataclasses, añade from pydantic import BaseModel; ③ En rutas FastAPI, recibe el cuerpo de petición con user: Xxx = Body(...) para validación automática. Uso avanzado: Usar Annotated[User, Body(...)] en FastAPI controla aún más el tipo de medio del cuerpo de petición y comportamiento de validación.

¿Se suben los datos a servidores? ¿Es privado y seguro?

Se ejecuta completamente en tu navegador local. El análisis JSON, generación de código Python y descargas de archivos ocurren todo en el navegador vía JavaScript; ni tus datos JSON de entrada ni el código Python generado se suben a ningún servidor, ni se registran o cachean en la nube. JSON sensible que contiene claves API, tokens o campos de negocio no publicados es seguro de usar; los datos se borran cuando cierras la página. Después de cerrar o refrescar la página, todas las entradas, salidas e historial localStorage se borran de memoria sin residuos.

¿Necesito registrarme o iniciar sesión?

No. La herramienta es completamente gratuita, no requiere registro, inicio de sesión o autorización. Abre la página y úsala; todas las funciones están disponibles localmente en tu navegador. La herramienta es completamente gratuita, sin anuncios, no requiere autorización y no inserta marcas de agua ni código de seguimiento en resultados generados.

¿Qué pasa si el formato JSON es incorrecto?

La herramienta detecta automáticamente la validez JSON; en caso de error, aparece un mensaje de error rojo a la derecha con un botón "Reparar JSON". Al hacer clic, repara automáticamente errores comunes: comas finales, comillas simples reemplazadas por comillas dobles, completado de comillas faltantes para claves, eliminación de comentarios, etc. Después de reparación exitosa, continúa generando código Python. El JSON reparado no cambia la semántica original—solo repara formato; si el resultado de reparación no es ideal, deshaz manualmente y vuelve a pegar.

¿Convertir JSON grande causará retardo?

No hay límite de líneas explícito, pero el análisis y renderizado de JSON extremadamente grande en el navegador se ralentizará. Recomendaciones: ① Divide JSON y convierte por lotes; ② Concéntrate en un nivel de anidamiento a la vez; ③ Si necesitas generar por lotes 100+ clases, usa la herramienta CLI quicktype (pip install quicktype) o datamodel-code-generator. datamodel-code-generator (pip install datamodel-code-generator) es otra potente herramienta CLI que soporta salida directa de modelos Pydantic.

Solución de problemas

Aviso dice "Por favor ingrese datos JSON" o el lado derecho está vacío

El cuadro de entrada izquierdo está vacío o solo contiene espacios en blanco. Asegúrate de haber pegado contenido JSON válido, o haz clic en el botón de subida para seleccionar un archivo .json / .txt; también puedes hacer clic en el botón de ejemplo para cargar la muestra integrada.

Aviso dice análisis JSON falló

Causas comunes: comas finales, comillas simples en lugar de comillas dobles, claves sin comillas dobles, que contiene comentarios JavaScript. Haz clic en el botón "Reparar JSON" para autoreparar algunos errores; si aún falla, valida primero con una herramienta de formateo JSON.

Los tipos de campo generados no son lo suficientemente precisos

La herramienta infiere tipos de muestras JSON, ej., todos los enteros son int, todas las cadenas son str. Si necesitas tipos más precisos como Decimal, datetime, UUID, EmailStr, modifica manualmente tipos de campo después de la generación, y usa restricciones Field en modo Pydantic.

Campo null generó Optional[Any] en lugar de Optional[str]

Porque JSON null no puede inferir tipo específico, la herramienta cae seguramente a Optional[Any]. Si conoces el tipo real del campo, reemplázalo con un valor de ejemplo (ej., "field": "") en el JSON fuente, regenera, luego cambia manualmente a Optional[str].

Aviso en tiempo de ejecución dice falta módulo typing

typing es biblioteca estándar Python 3.5+; dataclass es biblioteca estándar Python 3.7+. Comprueba versión Python: python --version. Si la versión es demasiado baja, actualiza a Python 3.9+ para mejor sintaxis genérica (list[str], dict[str, Any]).

Quiero generar Pydantic BaseModel pero no quiero reescribir manualmente

La herramienta genera dataclass por defecto. Si tu proyecto debe usar Pydantic, hay dos enfoques: ① Después de copiar el resultado generado, usa Buscar y Reemplazar de tu IDE para cambiar @dataclass por class Xxx(BaseModel):, cambiar from dataclasses import dataclass por from pydantic import BaseModel; ② Usa la herramienta CLI datamodel-code-generator (pip install datamodel-code-generator) en su lugar, que soporta salida directa de modelos Pydantic.

Archivo .py descargado da error de importación en proyecto

Causas posibles: ① Versión Python inferior a 3.7 (sin dataclasses); ② El proyecto tiene modo mypy estricto pero los campos no están tipados; ③ Nombre de clase entra en conflicto con otros módulos en el proyecto. Soluciones: Actualiza Python a 3.9+, asegura que todos los campos tienen anotaciones de tipo, renombra clases en conflicto con import as.

Campos JSON snake_case inconsistentes con estilo de nomenclatura Python

La herramienta mantiene nombres de campo JSON originales al generar campos Python. Python recomienda nomenclatura snake_case, que es naturalmente consistente con el estilo de campos JSON; si necesitas camelCase (ej., interfaz con frontend JavaScript), cambia manualmente nombres de campo o configura mapeo de alias vía alias_generator de Pydantic.

La página se ralentiza al convertir JSON muy grande

Recomendamos dividir JSON en múltiples módulos independientes y convertir por separado, o extraer solo las partes que necesitan modelado. Renderizar muchas dataclasses en el navegador consume memoria significativa; para JSON de más de 10MB, recomendamos usar la herramienta CLI quicktype (npx quicktype) o datamodel-code-generator.

Validación de campo de cuerpo de petición FastAPI falla (error 422)

FastAPI por defecto usa validación estricta con Pydantic; campos faltantes o desajustes de tipo devuelven 422. Soluciones: ① Cambia tipo de campo a Optional[tipo] = None para hacer campos opcionales; ② Usa Field(default=..., description=...) para establecer valores por defecto y documentación; ③ Comprueba que Content-Type del cuerpo de petición debe ser application/json.

Glosario

dataclass
Decorador de biblioteca estándar Python 3.7+ (@dataclass) usado para generar automáticamente métodos mágicos como __init__, __repr__, __eq__. Esta herramienta genera clases @dataclass, ej., @dataclass class User: id: int; name: str. Esencialmente desacopla "almacenamiento de datos" de "operaciones de datos", dejando que las clases se enfoquen en describir campos de datos mientras el decorador autogenera métodos repetitivos.
módulo typing
Biblioteca estándar Python para anotaciones de tipo, proporcionando tipos genéricos como List, Dict, Optional, Any, Union. List[T], Optional[Any] generados por esta herramienta provienen del módulo typing. Python 3.9+ puede usar directamente list, dict integrados. Junto a collections.abc, contextlib, etc., es el módulo central para restricciones de tipo estático en biblioteca estándar Python; gradualmente se convirtió en estándar para grandes proyectos desde PEP 484.
Optional[T]
Tipo opcional del módulo typing, equivalente a Union[T, None], indicando que un campo puede ser None. Esta herramienta mapea JSON null a Optional[Any], que puede cambiarse manualmente a tipos más precisos como Optional[str]. Ten en cuenta que Optional[T] difiere del valor por defecto T = None: el primero es una expresión None a nivel de tipo, el segundo es una configuración por defecto a nivel de valor.
List[T]
Tipo de lista genérica Python. Esta herramienta mapea automáticamente arrays JSON a List[T], ej., arrays de cadenas se mapean a List[str], arrays de objetos a List[Item]. Python 3.9+ puede escribir list[T]. La herramienta importa desde typing por defecto, equivalente a list[T] integrado de Python 3.9+; si tu equipo prefiere sintaxis nueva, reemplaza la importación con un clic.
Any
Tipo especial del módulo typing que indica aceptación de cualquier tipo. Esta herramienta por defecto usa Any como respaldo para valores null y arrays vacíos para evitar errores de inferencia de tipos. El uso frecuente de Any desactiva la comprobación mypy / pyright; recomendamos cambiar a tipos precisos como Optional[str], List[int] después de determinar tipos de campo.
Pydantic BaseModel
Clase base de modelo de datos de la biblioteca Pydantic, proporcionando validación de datos en tiempo de ejecución, serialización y deserialización. Las dataclasses generadas por esta herramienta pueden adaptarse a BaseModel con un clic para validación de cuerpo de petición FastAPI. Pydantic v2 reescribió lógica de validación central en Rust, con mejora de rendimiento 5-50x sobre v1; las dataclasses generadas por esta herramienta también pueden heredar BaseModel para disfrutar esta aceleración.
FastAPI
Framework web Python moderno que depende de Pydantic para validación automática de cuerpo de petición. Las dataclasses generadas por esta herramienta pueden servir como plantillas de modelo de petición/respuesta para funciones de ruta FastAPI. Basado en Starlette + Pydantic, autogenera documentación OpenAPI y es uno de los estándares de facto para frameworks API backend Python hoy en día.
PEP 557
Propuesta de Mejora Python que define la sintaxis y comportamiento del decorador dataclass. El código generado por esta herramienta cumple totalmente con las especificaciones PEP 557. La propuesta fue iniciada por Eric V. Smith en 2017, tomando ideas de diseño de soluciones existentes como attrs y registros Haskell.
Anotación de Tipo (Type Hint)
Anotaciones de tipo marcadas con : Type después de parámetros de función y variables Python. Los campos dataclass generados por esta herramienta tienen todos anotaciones de tipo, permitiendo comprobación de tipo estático con mypy / pyright. Las anotaciones en sí mismas no afectan el comportamiento en tiempo de ejecución, solo se usan para sugerencias IDE, comprobación estática mypy / pyright y bibliotecas de validación en tiempo de ejecución (como Pydantic).
PEP 484
Propuesta de especificación de anotaciones de tipo Python que define el módulo typing y sintaxis genérica. List[T], Optional[T], etc. generados por esta herramienta siguen PEP 484. Redactado por Guido van Rossum, Jukka Lehtosalo, Łukasz Langa y otros, es el documento fundacional para el sistema de anotaciones de tipo de Python.
from __future__ import annotations
Sentencia de evaluación de anotaciones diferida introducida en PEP 563, almacenando todas las anotaciones como cadenas para evitar problemas de referencia hacia adelante. Añadir esta línea a dataclasses generadas por esta herramienta hace que el orden de referencia de anotaciones de tipo sea irrelevante. Cuando se habilita, todas las anotaciones se evalúan perezosamente como cadenas, evitando problemas de referencia hacia adelante y desacoplando el orden de campos dataclass del orden de referencia.
model.py
Nombre de archivo predeterminado descargado por esta herramienta, conforme a convenciones de proyectos Python. Puede renombrarse a user.py, schemas.py u otros nombres que coincidan con la estructura del proyecto. Consistente con estilos de nomenclatura como models.py de Django, models.py de Flask; proyectos multi-modelo pueden dividirse en submódulos como user.py, order.py bajo un paquete models.

Tabla de referencia de mapeo de tipos JSON a tipos Python

La herramienta infiere automáticamente tipos Python correspondientes basados en tipos de valor JSON:

Ejemplo Valor JSONTipo Python GeneradoDescripción
nullOptional[Any]Tipo de valor null incierto; usa Optional[Any] como respaldo, puede cambiarse manualmente a tipos precisos como Optional[str]
true / falseboolBooleanos JSON se mapean directamente a bool Python
42intEnteros JSON por defecto a int Python (precisión arbitraria)
3.14floatFlotantes JSON por defecto a float Python (doble precisión)
"hello"strCadenas JSON se mapean a str Python (cadenas Unicode)
["a","b"]List[str]Arrays de cadenas se mapean a List[str]; Python 3.9+ puede escribir list[str]
[1,2,3]List[int]Arrays de enteros se mapean a List[int]
[{...},{...}]List[Item]Arrays de objetos generan @dataclass correspondiente desde el primer elemento, luego envuelto con List
[]List[Any]Arrays vacíos no pueden inferir tipo de elemento; usa Any como respaldo
{...} objeto anidado@dataclass separadaObjetos anidados generan clases @dataclass separadas nombradas con nombres de campo en PascalCase

Explicación de estructura de código Python generado

El código típico que quicktype-core genera para Python incluye las siguientes partes:

Parte CódigoEjemploPropósito
from dataclasses import dataclassfrom dataclasses import dataclassImportar decorador dataclass (biblioteca estándar Python 3.7+)
from typing import Any, List, Optionalfrom typing import Any, List, OptionalImportar anotaciones de tipo del módulo typing: Any (cualquier tipo), List (lista genérica), Optional (tipo opcional)
@dataclass@dataclass class User:El decorador hace que la clase genere automáticamente métodos como __init__, __repr__, __eq__
Declaraciones de camposid: int name: strDefiniciones de campo con anotaciones de tipo, convirtiéndose automáticamente en parámetros __init__
Campo List[T]tags: List[str]Representa un campo de array JSON; tipo de elemento inferido del primer elemento del array
Campo Optional[Any]label: Optional[Any] = NoneRepresenta un campo que puede ser null; valor por defecto None hace la instanciación más amigable
@dataclass anidadaaddress: AddressReferencia otras clases @dataclass en el mismo módulo, formando estructuras fuertemente tipadas

Comparación de soluciones de modelado de datos Python

La herramienta genera @dataclass por defecto, pero hay múltiples opciones de modelado de datos en el ecosistema Python; elige según necesidades del proyecto:

SoluciónMétodo ImportaciónValidación Tiempo EjecuciónEscenarios Típicos
@dataclassfrom dataclasses import dataclassNinguna (solo anotaciones de tipo)DTOs internos, modelos ORM, contenedores de datos puros; primera opción cero dependencias para Python 3.7+
Pydantic BaseModelfrom pydantic import BaseModelFuerte (conversión automática de tipos + validadores personalizados)Cuerpos petición/respuesta FastAPI, validación archivos configuración, transferencia datos entre procesos
attrs @attr.sfrom attrs import frozen, fieldValidadores opcionalesEscenarios de alto rendimiento que requieren slots / frozen / conversores personalizados
TypedDictfrom typing import TypedDictNinguna (solo anotaciones de tipo; sigue siendo dict en tiempo de ejecución)Sugerencias de tipo ligeras que requieren compatibilidad total con dict; ej., comprobación estática mypy
dataclasses-jsonfrom dataclasses_json import DataClassJsonMixinPuede funcionar con PydanticEscenarios de deserialización añadiendo métodos .to_json() / .from_json() a dataclass
msgpack + dataclassimport msgpackNinguna (capa serialización)Escenarios de transferencia binaria de alto rendimiento (msgpack 30%-50% más pequeño que JSON)

Tabla de compatibilidad de versiones Python y características dataclass

Diferentes versiones Python tienen soporte variado para dataclass, typing, Pydantic; elige por versión:

Versión PythonSoporte dataclassSoporte typingUso Recomendado
3.6 e inferiorNinguno (requiere pip install dataclasses)typing básico disponibleNo recomendado; actualiza a 3.9+
3.7 - 3.8Decorador @dataclassList[T], Optional[T] requieren import typingVersión mínima utilizable; compatible con proyectos mainstream
3.9 - 3.10@dataclass + field + asdict completosPuede usar list[T] integrado, dict[str, Any], PEP 585Recomendado: sintaxis anotación tipo moderna + dataclass completa
3.10+@dataclass(slots=True) ahorra memoriaPEP 604: int | None reemplaza Optional[int]Mejor: slots + sintaxis unión moderna
3.11+@dataclass + slots + frozen optimizaciones rendimientoCaracterísticas avanzadas como Self, TypeVarTuple, ConcatenatePrimera opción para proyectos nuevos; proyectos antiguos pueden actualizar gradualmente
3.12+Sintaxis parámetros tipo PEP 695 (type List[T])Nueva sintaxis anotación tipo completaExploración características vanguardistas; entornos producción recomiendan 3.11+

Privacy & Security

Todas las operaciones de esta herramienta JSON a Python ocurren completamente localmente en tu navegador: análisis JSON, generación de código Python y descargas de archivos se ejecutan todas del lado del cliente vía JavaScript del navegador; ningún contenido JSON, archivos subidos o código generado se envían por la red a ningún servidor. Las subidas de archivos usan la API nativa FileReader del navegador para leer directamente en memoria sin pasar por servicios intermedios. No se usa seguimiento de Cookies, no se recopilan datos de entrada o uso del usuario. Después de cerrar o refrescar la página, todo el contenido de entrada y salida se borra automáticamente de memoria. Adecuado para procesar JSON que contiene claves API, tokens y datos de negocio sensibles.

Authoritative References