Generador de esquema JSON

Pega JSON para generar automáticamente un JSON Schema.

Ningún dato sale de tu dispositivo

Cómo usar

  1. Pega un objeto o un array JSON en la zona de entrada.
  2. Activa las opciones: incluir los arrays «required» o los «examples» a partir de tus valores.
  3. Haz clic en Generar el esquema para crear un JSON Schema (Draft 2020-12).
  4. Copia o descarga el esquema generado.

Preguntas frecuentes

¿Qué versión de JSON Schema se genera?

El generador produce JSON Schema Draft 2020-12 (https://json-schema.org/draft/2020-12/schema), el último borrador estable.

¿Gestiona objetos y arrays anidados?

Sí. El generador procesa recursivamente los objetos y arrays anidados. Para los arrays, infiere el esquema a partir del primer elemento.

¿Puedo editar el esquema generado?

La salida es un punto de partida. Puede que quieras añadir restricciones como minLength, minimum, pattern o enum según tus necesidades.

Para qué sirve JSON Schema

JSON Schema es una forma declarativa de describir cómo debe verse un documento JSON: qué propiedades tiene, qué tipos llevan esas propiedades, qué es requerido vs opcional y qué valores son válidos. Es el equivalente del mundo JSON a XSD para XML o a una definición de tabla de base de datos. El proyecto oficial vive en json-schema.org.

Donde te lo encontrarás:

Los drafts que verás por ahí

La especificación de JSON Schema se ha publicado como una serie de drafts. El draft estable actual es 2020-12 (según la página oficial de la spec: «The current version is 2020-12»). Los drafts que podrías encontrarte:

Ante la duda, elige el draft que coincida con tu validador. AJV (el validador de JavaScript más popular) soporta Drafts 04, 06, 07, 2019-09 y 2020-12 con opt-in explícito. jsonschema en Python hace lo mismo. Si no sabes qué quiere tu consumidor aguas abajo, 2020-12 es un default seguro para trabajo nuevo.

Los tipos integrados

JSON Schema describe siete tipos base correspondientes a las clases de valor de JSON:

tipoValor JSONPalabras clave comunes
string"hello"minLength, maxLength, pattern, format
number42, 3.14minimum, maximum, exclusiveMinimum, multipleOf
integer42Subconjunto de number; sin componente fraccional.
booleantrue / falseSin restricciones adicionales.
nullnullTipo distinto; explícito cuando los nulls son válidos.
array[…]items, minItems, maxItems, uniqueItems
object{…}properties, required, additionalProperties

Las palabras clave de composición te dejan mezclar y combinar: oneOf (exactamente uno), anyOf (al menos uno), allOf (todos), not (el inverso). Más enum para una lista finita de valores permitidos y const para un único valor fijo.

Lo que un schema autogenerado puede y no puede decirte

Inferir un schema desde un único ejemplo JSON es potente pero limitado. El generador puede detectar:

No puede detectar:

Trata la salida como un punto de partida al 70%. Las adiciones valiosas (qué campos están realmente requeridos, qué formatos de cadena aplican, qué rangos de valor están permitidos, qué significa cada campo) son la fase de curaduría humana.

Dos trampas sutiles que conviene conocer

JSON Schema vs Zod / Joi / Yup vs tipos de TypeScript

Varias tecnologías se solapan con el rol de JSON Schema; cada una tiene un sweet spot distinto:

Si tu schema necesita ser consumido por varios lenguajes o por herramientas (IDEs, tooling de OpenAPI, generadores de código), JSON Schema es el hogar correcto. Si te quedas dentro de un solo lenguaje, la opción nativa de ese lenguaje suele ser más agradable de escribir.

Casos de uso comunes

Errores comunes

  1. Tratar el schema autogenerado como la spec final. Es un punto de partida. Añade pistas de formato, marca campos genuinamente opcionales, añade documentación, define rangos de valor.
  2. Saltarse la declaración $schema. Los validadores la usan para saber qué draft aplicar. Inclúyela siempre arriba del schema.
  3. Tratar required como un atributo por propiedad. A diferencia de XSD o de los schemas de Mongoose, el required de JSON Schema es un array a nivel del objeto padre que lista los nombres de las propiedades requeridas.
  4. Olvidar additionalProperties: false cuando quieres validación estricta. El default es true, lo que significa que las claves desconocidas se permiten silenciosamente.
  5. Confundir enum con examples. enum = la lista de valores permitidos (validación). examples = valores de muestra sólo para documentación (sin efecto de validación).
  6. Asumir que format se hace cumplir. Por defecto en Draft 2020-12 es una anotación, no una aserción; tu regex de email no se ejecuta a menos que optes por ello.
  7. Inferir opcionalidad desde un único ejemplo. Cada clave de tu ejemplo se vuelve requerida por defecto. Las specs reales casi siempre tienen campos opcionales; quítalos del array required como parte de la curaduría.

Más preguntas frecuentes

¿Funcionará el schema con OpenAPI 3.1?

Sí. OpenAPI 3.1 (lanzado en febrero de 2021) alineó su lenguaje de schema completamente con JSON Schema Draft 2020-12, que es lo que este generador emite. Mete el schema en components.schemas dentro de tu documento OpenAPI y referéncialo vía $ref. El antiguo OpenAPI 3.0 usaba un subconjunto anterior; podrías necesitar ajustar si te diriges a 3.0.

¿Puedo generar tipos en mi lenguaje a partir de este schema?

Sí. quicktype genera TypeScript, Go, Python, Java, C#, Swift, Kotlin, Rust, Elm y otros desde un JSON Schema. json-schema-to-typescript es una alternativa específica de JS. La mayoría de lenguajes modernos tienen al menos una herramienta schema-a-tipos; el schema generado funciona como entrada para todas ellas.

¿Cuál es la diferencia entre $defs y definitions?

Ambos son lugares para poner sub-schemas reutilizables que puedes $referenciar en otra parte del documento. definitions es el nombre legacy, usado en Drafts 04, 06 y 07. $defs es el nombre actual, introducido en Draft 2019-09 y continuando en 2020-12. Funcionalmente equivalentes, pero usa $defs para trabajo nuevo.

¿Mi JSON se envía a algún sitio?

No. La generación de schema corre enteramente en tu navegador. El JSON pegado se parsea localmente, se recorre y se emite como un schema en el textarea de salida. Nada se sube a un servidor, se loguea ni se conserva tras cerrar la pestaña. Esto importa porque los ejemplos JSON suelen contener datos reales (registros de cliente, respuestas de API internas, info de empleados) que no quieres que pasen por un tercero.

¿Por qué el schema de mi array sólo describe el primer elemento?

La inferencia desde un único ejemplo trata los arrays como homogéneos: mira el primer elemento y asume que el resto coincide. Si tu array real puede contener formas distintas, tendrás que escribir los items como { "oneOf": [...] } a mano. O ejecutar el generador en cada variante por separado y combinar los schemas.

¿Debería usar un generador o escribir el schema a mano?

Para un schema pequeño que controlas de extremo a extremo, escribirlo a mano te enseña la spec más rápido. Para una respuesta de API grande con docenas de objetos anidados, generar te da un borrador en segundos y dedicas el tiempo ahorrado a curar restricciones, descripciones y arrays required. La mayoría de los desarrolladores en activo hacen ambas cosas: generar, luego curar.

Herramientas relacionadas

Formateador y validador JSON gratuito en línea Comparador JSON Convertidor JSON a YAML