Validador JSON Schema
Valida JSON contra cualquier JSON Schema al instante en tu navegador. Compatible con Draft 2020-12, 2019-09 y Draft-07 con mensajes de error con ruta precisa. 100% privado, sin carga, sin cuenta, gratis.
¿Qué es un Validador JSON Schema?
Un validador JSON Schema es un programa que toma dos documentos JSON — un documento de datos y un documento de esquema — y reporta si los datos cumplen el contrato del esquema. El esquema declara tipos de campo, claves requeridas, rangos de valores, valores enum permitidos, patrones regex y reglas estructurales mediante un vocabulario fijo (type, properties, required, items, enum, oneOf, allOf, $ref, format). El validador recorre ambos documentos en paralelo y emite cero o más errores, cada uno fijado a una ruta JSON Pointer dentro de los datos.
La validación se ejecuta en tiempo de ejecución, en la frontera entre la entrada no confiable y tu código. Los tipos de TypeScript desaparecen en tiempo de compilación y no pueden ayudar con JSON que llega de un webhook, una API de terceros o un pegado de usuario — esa brecha es exactamente la que cubre JSON Schema. Combínalo con TypeScript (o Pydantic en Python) y obtienes garantías en tiempo de compilación dentro de tu base de código más garantías en tiempo de ejecución en la frontera.
Draft 2020-12 es la especificación actual y la que deberías elegir para nuevos proyectos en 2026. Drafts anteriores (2019-09, Draft-07, Draft-06, Draft-04) sobreviven en bases heredadas — Draft-07 sigue siendo común en charts de Helm, ajustes de VS Code y configuraciones antiguas de Ajv. OpenAPI 3.1 usa Draft 2020-12 nativamente; OpenAPI 3.0 usa un subconjunto de Draft 4.
Esta herramienta se ejecuta totalmente en tu navegador. Tu JSON, tu esquema y la salida de validación nunca abandonan tu equipo — segura para contratos de API propietarios y payloads sensibles. Los punteros $ref internos se resuelven automáticamente; los refs HTTP externos están desactivados a propósito para preservar la privacidad.
¿Trabajas con herramientas JSON adyacentes? Da formato al JSON con el Formateador JSON antes de pegarlo; compara dos documentos JSON con JSON Diff; convierte con JSON a YAML y YAML a JSON. Para validación completa en Node, Python y el navegador, consulta nuestra guía de validación JSON Schema.
// A 5-line schema that catches three real bugs
const schema = {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": { "type": "integer", "minimum": 1 },
"email": { "type": "string", "format": "email" },
"age": { "type": "integer", "minimum": 0, "maximum": 150 }
},
"required": ["id", "email"],
"additionalProperties": false
};
// Three bugs the schema catches:
const bad = { "id": "42", "age": 200 };
// /id → type: expected integer, got string
// /email → required: missing
// /age → maximum: 200 > 150
// In Node: new Ajv().compile(schema)(bad) // false; ajv.errors has the paths
// In Python: jsonschema.validate(bad, schema)
// In the browser: this tool — same errors, same paths, no install Características principales
Soporte multi-Draft
Draft 2020-12 (predeterminado), 2019-09 y Draft-07. Autodetecta el draft a partir del URI $schema; selector de respaldo para esquemas que no lo tengan.
Errores con ruta precisa
Cada error incluye un JSON Pointer (p. ej. /user/email/0), la keyword que falla (type, required, pattern) y un mensaje de una línea. Haz clic para saltar a la ubicación.
Validación en vivo
Valida mientras escribes. Los errores se actualizan en tiempo real para que itera sobre el esquema o los datos sin pasar por botones de Validate.
Cobertura de keywords format
email, uri, uuid, date, date-time, ipv4, ipv6, hostname, regex — los formats que de verdad utilizas, validados con patrones probados.
100% basado en navegador
Las entradas nunca salen de tu equipo. Sin carga, sin analítica sobre lo que pegas, sin localStorage del JSON. Segura para contratos propietarios y payloads sensibles.
Esquemas de muestra, un clic
Presets cargables (formulario de registro, sobre de webhook, archivo de configuración, array de pedidos) te llevan a una validación funcional en menos de cinco segundos.
Ejemplos
Objeto válido — required + tipos
{
"id": 42,
"email": "alice@example.com",
"age": 30
} {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": { "type": "integer", "minimum": 1 },
"email": { "type": "string", "format": "email" },
"age": { "type": "integer", "minimum": 0, "maximum": 150 }
},
"required": ["id", "email"],
"additionalProperties": false
} El esquema declara id y email como requeridos y fija los tipos. Los datos anteriores pasan la validación — todas las restricciones se cumplen. Prueba a quitar email o cambiar id a una cadena para ver errores con ruta precisa.
Inválido — falta required + tipo incorrecto
{
"id": "42",
"age": 200
} {
"type": "object",
"properties": {
"id": { "type": "integer" },
"email": { "type": "string", "format": "email" },
"age": { "type": "integer", "maximum": 150 }
},
"required": ["id", "email"]
} Tres errores: /id es una cadena en lugar de entero, /email falta, /age (200) supera el maximum 150. Cada error reporta la ruta JSON Pointer exacta para que puedas corregir los datos — o relajar el esquema — sin adivinar.
Unión discriminada — oneOf con const
{
"type": "order.created",
"data": { "orderId": "ORD-001234", "totalUsd": 49.99 }
} {
"oneOf": [
{
"properties": {
"type": { "const": "order.created" },
"data": {
"type": "object",
"properties": {
"orderId": { "type": "string", "pattern": "^ORD-[0-9]{6}$" },
"totalUsd": { "type": "number", "minimum": 0 }
},
"required": ["orderId", "totalUsd"]
}
},
"required": ["type", "data"]
},
{
"properties": {
"type": { "const": "order.refunded" },
"data": { "type": "object", "required": ["refundId"] }
},
"required": ["type", "data"]
}
]
} Validación de un sobre de webhook. La primera rama de oneOf coincide porque type es "order.created". Cambia type a "order.refunded" o rompe el patrón de orderId para ver cómo oneOf reporta los fallos por rama.
Array de objetos — items + uniqueItems
[
{ "sku": "A1", "qty": 3 },
{ "sku": "B2", "qty": 5 },
{ "sku": "A1", "qty": 3 }
] {
"type": "array",
"minItems": 1,
"uniqueItems": true,
"items": {
"type": "object",
"properties": {
"sku": { "type": "string", "pattern": "^[A-Z][0-9]+$" },
"qty": { "type": "integer", "minimum": 1 }
},
"required": ["sku", "qty"]
}
} Dos elementos son idénticos byte a byte, así que uniqueItems se dispara. Los elementos 0 y 2 colisionan — el validador reporta el duplicado en la raíz del array. Útil para detectar duplicados en líneas de carrito y errores de fusión en peticiones de envío.
Cómo usar
- 1
Pega tu JSON Schema
Coloca tu esquema en el panel derecho. El validador autodetecta el draft a partir del URI $schema si está presente; en caso contrario, elige Draft 2020-12, 2019-09 o Draft-07 en la barra de herramientas.
- 2
Pega tus datos JSON
Coloca el documento JSON que quieres comprobar en el panel izquierdo. La validación se ejecuta mientras escribes; las entradas grandes (>200 KB) cambian a un botón manual de Validate para que la escritura siga ágil.
- 3
Lee la lista de errores
Cada error tiene una ruta JSON Pointer, una keyword y un mensaje de una línea. Haz clic en un error para saltar a la ubicación en tus datos, corrígelo y observa cómo el contador baja en tiempo real.
Errores comunes en JSON Schema
Type: integer vs number
JSON Schema trata 1.0 como number pero no como integer. Si tu contrato dice integer, el validador rechaza 1.0 — aunque la mayoría de lenguajes lo consideren igual a 1. Elige number salvo que de verdad necesites integer.
{ "qty": 1.0 } schema: { "type": "integer" } → error: not an integer { "qty": 1 } schema: { "type": "integer" } → valid required en el nivel de anidamiento incorrecto
required debe ir junto a properties, no dentro de una propiedad. Un array required dentro de la declaración de una propiedad se ignora silenciosamente — el validador nunca lo aplica.
{ "properties": { "name": { "type": "string", "required": true } } } { "properties": { "name": { "type": "string" } }, "required": ["name"] } El valor por defecto de additionalProperties es true
Sin additionalProperties: false, el esquema es abierto — cualquier clave extra pasa. Olvidar esto es la razón más común de que los esquemas "acepten todo".
{ "properties": { "id": { "type": "integer" } } } accepts: { "id": 1, "foo": "bar", "x": null } { "properties": { "id": { "type": "integer" } }, "additionalProperties": false } OpenAPI 3.0 nullable vs array de tipos en Draft 2020-12
OpenAPI 3.0 usa nullable: true; Draft 2020-12 usa type: ["string", "null"]. Mezclarlos produce esquemas que parecen correctos pero nunca permiten null en realidad.
{ "type": "string", "nullable": true } in 2020-12: nullable is just an unknown keyword { "type": ["string", "null"] } in 2020-12: explicitly allows null Patrón sin anclas
El regex de JSON Schema coincide en cualquier parte por defecto — pattern: "^[A-Z]+$" ancla a toda la cadena, pero pattern: "[A-Z]+" coincide si existe alguna letra mayúscula en cualquier sitio.
pattern: "[A-Z]+" accepts: "helloX" (because X matches)
pattern: "^[A-Z]+$" accepts only: "HELLO"
oneOf donde se quería anyOf
oneOf exige que coincida exactamente una rama. Si dos ramas aceptan la misma forma, oneOf falla con datos que anyOf aceptaría — y el mensaje de error es confuso ("matches more than one").
oneOf: [ { type: "string" }, { type: "string", maxLength: 10 } ] on: "hi" → error: matches both anyOf: [ { type: "string" }, { type: "string", maxLength: 10 } ] on: "hi" → valid Casos de uso comunes
- Validación de petición de API
- Pega un cuerpo de petición y el esquema de tu endpoint antes de desplegar. Atrapa respuestas 400 que tus tests no cubrieron — campos requeridos faltantes, tipos incorrectos, números fuera de rango.
- Verificación de payload de webhook
- ¿El proveedor envió un payload que tu manejador rechaza? Valida el payload real contra tu esquema y luego contra el esquema publicado del proveedor. La diferencia entre ambos es tu bug.
- Linting de archivos de configuración
- package.json, tsconfig.json, helm values.yaml — todo archivo de configuración tiene un esquema público. Pega el esquema, pega la configuración, encuentra el typo. Olvídate del prueba y error.
- Pruebas de componentes OpenAPI
- Extrae un componente de esquema de un documento OpenAPI 3.1, pégalo aquí y valida payloads de muestra. Más rápido que levantar un servidor mock, determinista, sin SDK.
- Pre-vuelo de envío de formulario
- Pega un payload de formulario de muestra antes de cablear la validación del frontend. Confirma que el esquema rechaza lo que esperas y acepta lo que esperas, y luego envía el mismo esquema a cliente y servidor.
- Verificación de contrato de pipeline de datos
- ¿La salida ETL ha derivado? Pega una fila de muestra y el esquema posterior. Identifica qué productor cambió y qué claves se rompieron antes de que el pipeline reintente 10.000 registros.
Detalles técnicos
- Conforme con Draft 2020-12
- Implementa la especificación publicada de Draft 2020-12 — keywords, sistema de tipos, vocabulario format. Comprobado contra la salida de Ajv 8.x y ajv-formats.
- Rutas de error con JSON Pointer
- Los errores usan JSON Pointer RFC 6901 (/user/email/0). Cada fallo de keyword apunta a una ubicación resoluble única en los datos — sin ambigüedad, sin búsqueda por cadena.
- Resolución interna de $ref
- Resuelve punteros $ref dentro de un único documento (#/$defs/foo, #/properties/bar). Detecta y reporta ciclos. Los $ref HTTP externos están desactivados por privacidad.
Buenas prácticas
- Activa siempre additionalProperties: false
- En contratos de entrada (cuerpos de petición, archivos de configuración, mensajes de cola), las claves desconocidas suelen ser bugs — typos, campos accidentales o sondeos de atacantes. Recházalas por defecto.
- Usa $defs para subesquemas reutilizables
- Si copias la misma forma dos veces, divergirán. Mueve las definiciones compartidas a $defs y referéncialas con $ref — una sola fuente de verdad, todo cambio se aplica en todas partes.
- Valida antes de la lógica de negocio
- Ejecuta la validación de esquema justo después de JSON.parse, antes de tocar la estructura parseada. El estrechamiento de tipos, los valores por defecto y la persistencia asumen que el contrato se cumple — asegúrate de que así sea.
Preguntas frecuentes
¿Qué es la validación JSON Schema?
¿Qué drafts de JSON Schema admite este validador?
¿Cómo valido JSON contra un esquema?
¿Cuál es la diferencia entre validación JSON Schema y validación de sintaxis JSON?
¿Por qué mi esquema rechaza JSON que parece correcto?
¿Admite $ref y referencias remotas a esquemas?
¿Qué hace additionalProperties: false?
¿Cómo valido JSON contra un esquema en Node.js o Python?
¿Cuál es la diferencia entre oneOf, anyOf y allOf?
¿Admite esquemas OpenAPI?
¿Por qué el validador dice que mi JSON Schema es inválido?
¿La herramienta envía mi JSON o esquema a un servidor?
¿Puedo validar JSON Lines (NDJSON) o varios documentos?
Herramientas relacionadas
Ver todas las herramientas →Decodificador y Codificador Base64
Codificación y Formato
Decodifica y codifica Base64 online de forma gratuita. Conversión en tiempo real con soporte completo de UTF-8 y emojis. 100% privado — funciona en tu navegador. Sin registro.
JSON Diff (Comparar)
Codificación y Formato
Compara dos archivos JSON al instante en tu navegador. Resaltado lado a lado, salida RFC 6902 JSON Patch, ignora campos ruidosos como marcas de tiempo e IDs. 100% privado, sin carga.
Formateador y Validador JSON
Codificación y Formato
Formatea, valida y embellece JSON al instante en tu navegador. Herramienta gratuita con validación sintáctica, detección de errores, minificación y copia con un clic. 100% privado.
Convertidor JSON a YAML
Codificación y Formato
Convierte JSON a YAML al instante en tu navegador. Listo para K8s y Compose, sangría 2/4 espacios, protección Norway automática. 100% privado, sin carga.
Generador QR — URL, WiFi, vCard, Email, SMS, Ubicación
Codificación y Formato
Generador de QR gratuito. Crea códigos QR estáticos para URL, WiFi, vCard, email y SMS. Descarga en SVG y PNG. Sin caducidad, sin registro, 100% en tu navegador.
Codificador y Decodificador URL con Analizador Integrado
Codificación y Formato
Pega una URL para decodificarla o codificarla al instante. Analizador integrado descompone protocolo, host, ruta y parámetros en campos editables. Modos encodeURI y encodeURIComponent. 100% navegador — sin envío de datos.