Generador de JSON Schema - Generar Schema desde Datos JSON en Línea
Genere JSON Schema a partir de datos JSON para validación de API, documentación y generación de código. Soporta Draft-04, Draft-07 y 2020-12 — 100% del lado del cliente, sin envío de datos al servidor.
Preguntas Frecuentes
¿Qué es un Generador de JSON Schema?
Un Generador de JSON Schema es una herramienta que crea automáticamente una definición de JSON Schema a partir de datos JSON de muestra. JSON Schema es un vocabulario estándar (definido en json-schema.org) que describe la estructura, tipos y restricciones de documentos JSON. En lugar de escribir manualmente las definiciones del esquema, simplemente pegue un ejemplo JSON y la herramienta inferirá el esquema correcto incluyendo propiedades de objetos, tipos de datos, campos requeridos, tipos de elementos de arrays y formatos de cadenas como fechas y correos electrónicos.
¿Cómo genero JSON Schema a partir de mis datos JSON?
Pegue sus datos JSON en el campo de entrada del lado izquierdo. La herramienta genera instantáneamente un JSON Schema en el panel de salida de la derecha. Puede personalizar la salida seleccionando una versión de borrador del esquema (Draft-04, Draft-07 o 2020-12), activando la detección de campos requeridos, habilitando la detección de formato de cadenas para patrones como fechas y correos electrónicos, y controlando si se permiten propiedades adicionales.
¿Están seguros mis datos JSON al usar esta herramienta?
Sí, completamente. Esta herramienta procesa todo en su navegador usando JavaScript del lado del cliente. Sus datos JSON nunca salen de su computadora — no hay cargas al servidor, no hay llamadas API y no hay almacenamiento de datos. Esto lo hace seguro para usar con respuestas API sensibles, esquemas de datos propietarios y archivos de configuración confidenciales.
¿Qué versión de borrador de JSON Schema debo usar?
Elija según su ecosistema: Draft 2020-12 (predeterminado) es el último estándar estable y se usa en OpenAPI 3.1. Draft-07 es ampliamente compatible con bibliotecas de validación y herramientas, y es una opción segura para máxima compatibilidad. Draft-04 es necesario para sistemas heredados y compatibilidad con OpenAPI 3.0.
¿Cómo determina la herramienta los campos requeridos?
Por defecto, la herramienta marca todas las propiedades no nulas como requeridas en el esquema generado. Un campo con valor nulo se excluye del array required ya que null sugiere que el campo puede estar ausente u ser opcional. Puede desactivar completamente este comportamiento si prefiere esquemas sin restricciones de requerimiento.
¿Qué formatos de cadena detecta la herramienta?
Cuando la detección de formato está habilitada, la herramienta analiza los valores de cadena y agrega automáticamente la palabra clave 'format' para patrones reconocidos: date-time (marcas de tiempo ISO 8601), date, time, direcciones de correo electrónico, URI/URL, UUID, direcciones IPv4 y direcciones IPv6.
¿Qué hace la opción de 'propiedades adicionales'?
La palabra clave 'additionalProperties' en JSON Schema controla si un objeto puede contener propiedades no listadas en el esquema. Cuando se establece en 'Permitir' (predeterminado), el esquema generado permite campos adicionales. Cuando se establece en 'Denegar', agrega '"additionalProperties": false' a los esquemas de objetos, creando contratos estrictos que rechazan campos inesperados.
Ejemplos de Código
// JSON to JSON Schema generator
function jsonToSchema(json, options = {}) {
const { draft = '2020-12', includeRequired = true, detectFormats = true } = options;
const schemaUri = {
'draft-04': 'http://json-schema.org/draft-04/schema#',
'draft-07': 'http://json-schema.org/draft-07/schema#',
'2020-12': 'https://json-schema.org/draft/2020-12/schema',
}[draft];
function inferSchema(value) {
if (value === null) return { type: 'null' };
if (typeof value === 'boolean') return { type: 'boolean' };
if (typeof value === 'number') {
return { type: Number.isInteger(value) ? 'integer' : 'number' };
}
if (typeof value === 'string') {
const schema = { type: 'string' };
if (detectFormats) {
if (/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}/.test(value)) schema.format = 'date-time';
else if (/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value)) schema.format = 'email';
else if (/^https?:\/\//.test(value)) schema.format = 'uri';
}
return schema;
}
if (Array.isArray(value)) {
if (value.length === 0) return { type: 'array', items: {} };
const itemSchemas = value.map(inferSchema);
const unique = dedup(itemSchemas);
return { type: 'array', items: unique.length === 1 ? unique[0] : { oneOf: unique } };
}
if (typeof value === 'object') {
const properties = {};
const required = [];
for (const [key, val] of Object.entries(value)) {
properties[key] = inferSchema(val);
if (includeRequired && val !== null) required.push(key);
}
const schema = { type: 'object', properties };
if (required.length > 0) schema.required = required;
return schema;
}
return {};
}
function dedup(schemas) {
const seen = new Map();
for (const s of schemas) {
const key = JSON.stringify(s);
if (!seen.has(key)) seen.set(key, s);
}
return [...seen.values()];
}
const parsed = JSON.parse(json);
return { $schema: schemaUri, ...inferSchema(parsed) };
}
// Usage
const json = '{"name":"Alice","age":30,"email":"alice@example.com"}';
console.log(JSON.stringify(jsonToSchema(json), null, 2));