100 % local: tus datos nunca salen de tu navegador

JSON a Python — Pydantic, dataclass o TypedDict

Convierte una muestra JSON en clases de Python. Elige el estilo que ya usa tu proyecto y pega el resultado tal cual en models.py, sin retoques.

Instantáneo Privado Cero cookies
Estilo

Entrada JSON

Salida Python

Qué hace esta herramienta

Una muestra JSON pasa a ser clases de Python, una por objeto.

{ "id": 1, "firstName": "Ada", "address": { "city": "Paris" } }
from pydantic import BaseModel, Field


class Address(BaseModel):
    city: str


class Root(BaseModel):
    id: int
    first_name: str = Field(alias="firstName")
    address: Address

Los hijos se declaran primero: una clase debe existir antes de que otra anote un campo con ella. La salida apunta a un Python moderno: list[str] e int | str se escriben directamente, lo que exige 3.10 o posterior.

Tres estilos, tres costes distintos

estilolo que te dalo que cuesta
Pydanticvalidación en la frontera, alias para las claves renombradasuna dependencia y objetos que no son llanos
dataclassun contenedor simple, solo biblioteca estándarninguna validación y ningún alias para una clave renombrada
TypedDictanotaciones para los diccionarios que ya tienesnada en ejecución, y por tanto tampoco comprobación

La estructura es idéntica en los tres; lo que cambia es cuánto hace el tipo por ti.

Las palabras reservadas ya no rompen el archivo

{"class": 1} producía:

class Root(BaseModel):
    class: int

que no es Python: el archivo ni siquiera se analiza. Las palabras reservadas reciben ahora un guion bajo, y el alias de Pydantic conserva la clave:

    class_: int = Field(alias="class")

Era un defecto real, encontrado al escribir esta página y corregido. TypedDict lo resuelve de otro modo: una clave que no puede ser nombre de atributo hace que toda la definición pase a la sintaxis funcional, Root = TypedDict('Root', {"class": int}), donde las claves son cadenas y todo cabe.

Lo que una muestra no puede decirte

Nada es | None y nada tiene valor por defecto: todos los campos son obligatorios, porque la muestra los traía. Un null da el tipo None, que no acepta nada más; si el campo es «una cadena, a veces nula», el retoque es str | None, y = None si puede faltar.

Dos claves que dan el mismo snake_case —fooBar y foo_bar— se mantienen separadas con un sufijo numerado en vez de fundirse, y el alias deja constancia de cuál era cuál.

Privado por diseño

Todo se ejecuta localmente en tu navegador con JavaScript. Tus datos nunca se suben a un servidor, lo que hace que la herramienta sea segura para contenido sensible y funcione sin conexión.

Preguntas frecuentes

¿Cuál de los tres estilos elijo?
Pydantic si el dato viene de fuera y quieres validarlo en la frontera. `dataclass` si ya es de fiar y basta un contenedor simple. `TypedDict` si estás anotando diccionarios que ya tienes, sin tocar el código de ejecución. La estructura inferida es la misma; solo cambia lo que cuesta.
¿Por qué se renombra mi clave, y adónde fue?
Los atributos de Python van en snake_case: `firstName` pasa a `first_name`. En el estilo Pydantic la clave original se conserva con `Field(alias="firstName")`, y el análisis sigue funcionando. `dataclass` no tiene alias que ofrecer —solo se guarda el nombre— y `TypedDict` conserva la clave en bruto, pasando a su sintaxis funcional cuando una clave no es un nombre usable.
¿Qué pasa con una clave llamada `class` o `def`?
Recibe un guion bajo: `class_`, `def_`, con `Field(alias="class")` en Pydantic. Emitir `class: int` producía un archivo que Python ni siquiera analiza: era un defecto real, encontrado al escribir esta página y corregido. `TypedDict` esquiva la cuestión escribiendo `TypedDict('Root', {"class": int})`.

Convertidores relacionados