Cómo generar clases y tipos desde un JSON

La forma más rápida de tener los tipos de modelo de una API es generarlos a partir de una respuesta real: pega el JSON, elige tu lenguaje y copia el código. Un generador lee cada valor, decide si es texto, un entero, un decimal o una fecha, y convierte los objetos anidados en tipos propios. Esta guía explica qué puede saber un generador a partir de un ejemplo y qué no, y qué conviene revisar antes de que el código entre en tu proyecto.

5 min de lectura

Por qué generar los tipos

Los modelos tipados detectan errores pronto. Cuando la respuesta de una API está descrita por una interfaz o una clase, tu editor completa los nombres de los campos, el compilador detecta una clave mal escrita y un campo renombrado aparece como error en lugar de un undefined o un null silencioso al ejecutar. Escribir estos tipos a mano para una respuesta con cincuenta campos y tres niveles de anidación lleva tiempo y es fácil equivocarse.

Un generador hace la parte repetitiva en un segundo. El resultado es un buen primer borrador que después revisas, renombras donde haga falta y subes a tu repositorio.

Pruébalo aquí: JSON a código

Abrir la herramienta completa

Qué deduce un generador de tu ejemplo

Todo sale de los valores de tu JSON. Por eso la calidad del ejemplo importa más que cualquier otra cosa.

En el JSONSe deduce comoEjemplo
Textostring"name": "Ana"
Número enteroint, o long por encima de 2.147.483.647"id": 42
Número con punto decimaldouble o float"price": 19.0
true o falseboolean"active": true
Texto en formato de fecha ISOtipo de fecha, si está activado"created": "2026-10-27T09:30:00Z"
null en algunos elementostipo anulable"phone": null
Clave que falta en algunos elementoscampo opcional"discount" solo en un elemento
Objetoun nuevo tipo con nombre"address": { ... }
Lista de objetoslista de un único tipo combinado"items": [ { ... }, { ... } ]

Dale un ejemplo variado

Un generador solo puede describir lo que ve. Si tu ejemplo tiene un pedido con un solo artículo, todos los campos parecen obligatorios y ninguno parece anulable. Si tiene una lista de pedidos en la que unos llevan descuento y otros no, el campo del descuento se marca correctamente como opcional.

Así que, antes de generar, reúne una respuesta con varios elementos, a ser posible con casos límite: un cliente sin teléfono, un pedido sin artículos, un producto con precio decimal. Ponlos en un mismo array en el nivel principal y el generador los combinará todos en un tipo por cada forma.

  • Los campos que son null en todos los elementos reciben un tipo general como unknown, object o Any, porque el tipo real no se ve.
  • Las listas vacías se convierten en listas de elementos desconocidos por el mismo motivo.
  • Un campo que es número en un elemento y texto en otro pasa a ser una unión en TypeScript y un tipo general en los demás lenguajes.
  • Los ID grandes por encima de 2^53, como algunas claves de base de datos, son más seguros como texto. JavaScript no puede representarlos exactamente como números.

Nombres, atributos y convenciones

Las claves del JSON suelen seguir el estilo del backend, por ejemplo snake_case si viene de Python o Ruby, mientras que tu código cliente usa otro. Un buen generador renombra los campos según la convención del lenguaje de destino y guarda la clave original en un atributo, así la serialización sigue coincidiendo con los datos.

LenguajeNombres de campoCómo se conserva la clave del JSON
TypeScriptSin cambiosNo hace falta; las claves raras van entre comillas
C#PascalCase[JsonPropertyName] o [JsonProperty]
Pythonsnake_caseField(alias=...) en Pydantic
GoExportados, con ID y URLEtiquetas de struct json:"key"
JavacamelCase@JsonProperty (Jackson)
KotlincamelCase@SerialName (kotlinx.serialization)

Los tipos no son validación

Una interfaz de TypeScript desaparece al compilar el código. Si la API envía algo distinto de lo que promete la interfaz, nada lo detiene al ejecutar. Lo mismo pasa con las clases normales en la mayoría de lenguajes: el deserializador rellena lo que puede y deja vacío el resto.

Si los datos vienen de fuera de tu control, valídalos cuando lleguen. En Python, los modelos Pydantic lo hacen sin configuración extra, lo que es un buen motivo para elegir ese estilo en el generador. En TypeScript, a partir de las interfaces generadas puedes escribir esquemas con bibliotecas que comprueban los datos al ejecutar. En C#, Java y Kotlin, marca como obligatorios los campos que deben estar y deja que el serializador falle pronto.

Lista de comprobación antes de hacer commit

  • Cambia el nombre del tipo principal de Root a algo con sentido, como Order o Pedido.
  • Revisa cada campo tipado como unknown, object, Any o JsonElement y sustitúyelo por el tipo real.
  • Revisa los números: ¿un precio es de verdad un double o debería ser un tipo decimal para dinero?
  • Revisa las fechas: ¿las quieres como texto o como tipo de fecha con una zona horaria conocida?
  • Decide qué campos opcionales lo son de verdad y cuáles solo faltaban por casualidad en el ejemplo.
  • Une los tipos que el generador separó solo porque sus ejemplos eran un poco distintos.

Paso a paso

  1. Pega una respuesta JSONPega la respuesta de tu API o abre un archivo .json. Una lista con varios elementos da mejores resultados.
  2. Elige el lenguajeElige TypeScript, C#, Python, Go, Java o Kotlin y después el estilo, como record, dataclass o Pydantic.
  3. Pon nombre al tipo principalCambia Root en Nombre del tipo principal por el nombre que usa tu proyecto, por ejemplo Order.
  4. Copia y revisaCopia el código o descárgalo y después repasa la lista de comprobación de esta guía.

Preguntas frecuentes

¿Puedo generar los tipos desde un JSON Schema?

Esta herramienta trabaja con datos JSON, no con un esquema. Si tu API publica un JSON Schema o un archivo OpenAPI, un generador basado en el esquema da resultados más precisos, porque el esquema indica qué es obligatorio.

¿Por qué un campo es opcional en mi interfaz de TypeScript?

Al menos un elemento de tu ejemplo no tenía esa clave. Si en los datos reales siempre está, quita el signo de interrogación o añade un elemento completo al ejemplo.

¿El dinero debe ser un double?

Para cálculos con dinero, un tipo decimal como decimal en C# o BigDecimal en Java evita errores de redondeo. Un generador solo ve un número con punto decimal, así que cambia el tipo tú mismo.

¿Qué pasa con las claves con espacios o guiones?

Se convierten en nombres válidos en cada lenguaje, y la clave original se guarda en un atributo, una etiqueta o un alias. En TypeScript la clave simplemente va entre comillas.

¿Se sube mi JSON cuando genero el código aquí?

No. El generador funciona en tu navegador, así que las respuestas con datos privados se quedan en tu dispositivo.