JSON a clase Python

Genera dataclasses de Python a partir de JSON

Acerca de JSON a clase Python

JSON a clase Python genera clases de Python que describen la forma de una muestra JSON o de un JSON Schema: definiciones de tipos, no un dict con tus valores. Ejecuta quicktype-core en tu navegador. Cada objeto anidado se convierte en una clase, los nombres de campos pasan a snake_case (first-name se convierte en first_name), y los tipos usan int, float, str, bool, List y Optional de typing, además de Union cuando un valor tiene dos tipos y Any para un array vacío. Los campos que faltan en algunos elementos de un array reciben Optional[...] = None y se colocan después de los obligatorios, como exigen las dataclasses. En «Modelo», elige dataclasses, modelos Pydantic (BaseModel, con Field(alias=...) donde se renombra un campo) o TypedDict (el dict que devuelve json.loads, con las claves JSON tal cual); en «Versión de Python», la sintaxis de 3.6 a 3.10 o posterior. Por defecto no hay ninguna función from_dict ni to_dict: elige «Tipos y funciones from_dict / to_dict» en «Código» para obtenerlas. El JSON se puede pegar o abrir desde un archivo .json o .txt.

Ejemplo

Dos personas; solo Ada tiene cónyuge, así que spouse se vuelve Optional.

Entrada JSON

[{"first-name": "Ada", "age": 36, "spouse": {"name": "Bob"}},
 {"first-name": "Lin", "age": 29}]

Salida Python

from dataclasses import dataclass
from typing import Optional

@dataclass
class Spouse:
    name: str

@dataclass
class RootElement:
    first_name: str
    age: int
    spouse: Optional[Spouse] = None

Cómo convertir JSON en dataclasses de Python

  1. 1Pega tu JSON en «Entrada JSON», o haz clic en «Abrir un archivo» para cargar un archivo .json o .txt; un array de varios registros da mejores tipos que uno solo. Para un JSON Schema, elige «JSON Schema» en «Origen».
  2. 2Indica el «Nombre de la clase» y luego elige el «Modelo», la «Versión de Python» y el «Código».
  3. 3Haz clic en «Convertir» para ver las dataclasses en «Salida Python».
  4. 4Revisa los campos renombrados: las claves que coinciden con palabras clave de Python reciben un prefijo, como root_class para class.
  5. 5Haz clic en «Copiar», o en «Descargar» para obtener un archivo «model.py».

Formatos y límites

Entrada
Objeto JSON, array de objetos o JSON Schema, pegado o abierto desde un archivo .json o .txt; un array de valores simples como [1, 2] no tiene ninguna clase que generar
Salida
Dataclasses de Python, modelos Pydantic o TypedDict, con anotaciones de typing, guardados como model.py; funciones from_dict / to_dict si las eliges
Nombres
Campos en snake_case; un array de primer nivel da una clase llamada RootElement
Versión de Python
3.7 o posterior (módulo dataclasses) por defecto; 3.6 da clases simples con __init__, 3.9 list[int], 3.10 int | None; TypedDict requiere 3.8 o posterior
Fechas
str por defecto; datetime cuando «Fechas como datetime» está marcado y un valor es una fecha y hora ISO 8601 como 2024-05-01T10:00:00Z, y para "format": "date-time" en un JSON Schema; las funciones from_dict la leen entonces con python-dateutil; un TypedDict conserva str

Dónde se procesa tu JSON

Las dataclasses se producen localmente, en tu navegador, con el motor quicktype que se carga en tu primera conversión; tu JSON no se nos transmite. Si la herramienta muestra un error, el texto del mensaje se envía a nuestro registro de errores con el nombre de la herramienta y tu navegador y su versión, después de quitarle los fragmentos citados, los números largos y las direcciones.

Preguntas frecuentes

¿Crea un dict con mis datos?

No. Escribe definiciones de dataclasses que describen los datos. Para obtener un dict con tus valores, usa json.loads sobre el texto; para llenar una dataclass, pasa los valores correspondientes a su constructor, o elige «Tipos y funciones from_dict / to_dict» en «Código» y llama a root_from_dict(json.loads(text)).

¿Cómo se tipan los campos opcionales y null?

Optional[T] = None, cuando una clave falta en algunos elementos de un array o es null en algunos de ellos. Una clave que es null en todos los elementos no tiene nada de qué deducir un tipo y se tipa None, así que dale un valor real en la muestra si quieres un tipo. En un TypedDict, esa clave es Optional[T] en una parte declarada con total=False.

¿Genera modelos Pydantic?

Sí. Elige «Modelos Pydantic» en «Modelo»: cada clase hereda entonces de BaseModel, y un campo cuyo nombre difiere de su clave JSON, como first_name para first-name, recibe Field(alias="first-name"), de modo que Root.model_validate(data) lee el JSON y model_dump(by_alias=True) lo vuelve a escribir. Un campo que ocultaría un método de BaseModel, como json, se renombra json_.

¿Puede escribir un TypedDict en lugar de clases?

Sí. Elige «TypedDict» en «Modelo» para describir el dict que devuelve json.loads, sin convertirlo: las claves siguen siendo las claves JSON, una clave que no es un nombre de Python, como first-name, usa la forma TypedDict("Name", {...}), un enum de un JSON Schema se convierte en un Literal, y una fecha sigue siendo str. TypedDict requiere Python 3.8 o posterior.

¿Puedo partir de un JSON Schema?

Sí. Elige «JSON Schema» en «Origen» y luego pega o abre el esquema. Los tipos, las propiedades obligatorias (las demás pasan a Optional con = None), los enums (una clase Enum) y los formatos date-time (datetime) vienen del esquema. Un $ref solo se sigue dentro del documento (#/definitions/… o #/$defs/…): un esquema en otra dirección nunca se descarga, y la página lo indica.

¿Se distinguen los números enteros y los decimales?

Sí. Los números enteros se tipan int, y los números escritos con punto decimal o exponente se tipan float, incluso 10.0, así que un valor posterior como 10.5 sigue coincidiendo con la anotación.

Consejos y trucos

  • ✓Cambia RootElement o Root por un nombre que describa tus registros antes de usar las clases.