Convertidor de JSON a Python
Pega una respuesta de API o una configuración en JSON y obtén sus definiciones de tipos en Python. Elige @dataclass para objetos que creas en tu código o TypedDict para tipar diccionarios normales de json.loads. Los objetos anidados se convierten en clases propias, y las claves que faltan en algunos elementos pasan a ser opcionales.
Funciona en tu navegador: nada de lo que escribes se envía a ningún sitio.
Cómo usarlo
- Pega un ejemplo de JSON. Usa uno realista: cuantos más elementos tenga un array, mejor se detectan las claves opcionales.
- Elige @dataclass o TypedDict.
- Copia el código. Las clases de los objetos anidados van primero, así que el archivo se ejecuta de arriba abajo.
Cómo funciona
El ejemplo se lee como una estructura: cada clave de cada objeto con todos los tipos que aparecen en ella. Todos los objetos de un mismo array se fusionan en una sola clase.
- str, int, float, bool, list[…] y las clases anidadas se escriben directamente; null añade Optional[…].
- Los nombres de clase salen de la clave: «orders» contiene una lista de Order y «billing_address» pasa a BillingAddress. El nivel superior es Root.
- Solo se importa lo que se usa: dataclass, Any, Optional, TypedDict, NotRequired.
Ejemplo resuelto
{"items":[{"sku":"A","note":null,"qty":1},{"sku":"B","note":"x"}]} con @dataclass da:
from dataclasses import dataclass
from typing import Optional
@dataclass
class Item:
sku: str
note: Optional[str]
qty: Optional[int] = None
@dataclass
class Root:
items: list[Item]
«note» a veces es null, así que es Optional[str]. «qty» falta en el segundo elemento, así que recibe un valor por defecto y pasa al final.
Consejos
- Revisa los tipos de los campos en los que el ejemplo tuvo suerte: un precio de 10 en el ejemplo pasa a int aunque en otros datos pueda ser 9.99.
- Cambia el nombre de las clases para que encajen con tu dominio después de generarlas.
- Para JSON Schema o TypeScript, usa el generador de JSON Schema o JSON a TypeScript.
Preguntas frecuentes
¿Cómo se traducen los tipos de JSON a Python?
Las cadenas pasan a str, true y false a bool, los números enteros a int y los demás números a float (una mezcla de ambos da float). Los arrays pasan a list[...], los objetos a clases y null hace el tipo Optional[...]. Un lugar con valores de distinto tipo pasa a Any.
¿Cómo se tratan las claves opcionales?
Cuando un array contiene varios objetos, una clave que falta en algunos es opcional. En una dataclass pasa a Optional[...] = None y se mueve detrás de los campos obligatorios, como exigen las dataclasses; en un TypedDict se envuelve en NotRequired[...].
¿Qué pasa con las claves que no son nombres válidos en Python?
En una dataclass, claves como first-name, class o 2fa pasan a first_name, class_ y f_2fa, con la clave JSON original en un comentario. En un TypedDict la sintaxis funcional TypedDict('Name', {...}) conserva las claves tal cual.
¿Qué versión de Python necesito?
El código usa list[...] y Optional de typing, que funcionan en Python 3.9 y posteriores. NotRequired, que marca las claves opcionales de TypedDict, necesita Python 3.11 o typing_extensions.
¿Una dataclass interpreta el JSON anidado por mí?
No. Root(**data) solo rellena el nivel superior; los diccionarios anidados siguen siendo diccionarios. Convierte tú las partes anidadas o usa una biblioteca como pydantic o dacite.