Schema y validación
JSON Schema: valida un contrato de suscripción pequeño
Prueba un esquema 2020-12 completo con entradas válidas e inválidas, requisitos condicionales y una política explícita de campos adicionales.
Un esquema útil describe un contrato real e incluye entradas que debe aceptar y rechazar. No sustituye autenticación, autorización ni límites de recursos anteriores al parseo.
Prueba el ejemplo completo
Abre el validador JSON Schema y pega este esquema en su panel. También puedes descargar subscription.schema.json.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"additionalProperties": false,
"required": [
"plan",
"seats"
],
"properties": {
"plan": {
"enum": [
"basic",
"pro"
]
},
"seats": {
"type": "integer",
"minimum": 1,
"maximum": 25
},
"company": {
"type": "string",
"minLength": 1
}
},
"if": {
"properties": {
"plan": {
"const": "pro"
}
},
"required": [
"plan"
]
},
"then": {
"required": [
"company"
]
}
}
La suscripción ficticia tiene dos planes. seats debe ser un entero entre 1 y 25. El plan pro exige además una empresa no vacía. Esos límites pertenecen al ejemplo, no son una recomendación comercial.
Prueba cada entrada por separado:
Desplázate horizontalmente para ver todas las columnas.
| Entrada | Resultado y motivo |
|---|---|
{"plan":"basic","seats":2} |
Válida |
{"plan":"pro","seats":3,"company":"Example"} |
Válida |
{"plan":"pro","seats":3} |
Inválida: falta company |
{"plan":"basic","seats":0} |
Inválida: seats menor que el mínimo |
{"plan":"basic","seats":"2"} |
Inválida: string en vez de entero |
{"plan":"basic","seats":2,"admin":true} |
Inválida: campo adicional |
Comprueba que el error identifica la ruta de entrada o de esquema relevante. No conviertas tipos silenciosamente para superar la validación salvo que el contrato de la aplicación defina esa conversión.
Campos obligatorios, adicionales y condicionales
properties describe valores presentes; required exige que existan. Una empresa vacía falla minLength: incluir la clave no basta. La condición añade el requisito para pro sin duplicar el esquema completo.
Rechazar propiedades extra encaja con este contrato cerrado. Otros objetos de extensiones o metadatos permiten claves arbitrarias de forma intencionada. Decide esa política en cada nivel. Al componer esquemas, additionalProperties sólo reconoce las propiedades declaradas a su lado; los drafts recientes ofrecen también unevaluatedProperties para composición.
Escoge un dialecto compatible
La URI $schema identifica el dialecto previsto. JSONCraft utiliza @cfworker/json-schema con 2020-12 por defecto; tu backend puede usar otra biblioteca o versión. Comprueba soporte antes de copiar palabras clave nuevas a Draft 7. Por ejemplo, 2020-12 usa prefixItems para posiciones de tuplas: no lo mezcles con ejemplos antiguos de items como array.
Las referencias locales permiten reutilizar definiciones en $defs. Resuelve esquemas aprobados bajo control de la aplicación; aceptar referencias de red arbitrarias añade otro problema de disponibilidad y seguridad.
Formatos y límites
Que format compruebe validez depende del dialecto, vocabulario y configuración. Prueba la implementación concreta. Un string con forma de email no demuestra que exista el buzón; una URL sintácticamente válida no garantiza que sea seguro solicitarla. Conserva aparte esas comprobaciones de dominio.
Limita el tamaño y el trabajo antes de validar. Un esquema aplicado después de parsear no evita todas las reservas de memoria del parser. Consulta seguridad de entradas y utiliza el formateador para distinguir errores de sintaxis y de contrato.
Referencias: objetos JSON Schema, condiciones, formatos y validador usado por JSONCraft.
Herramientas relacionadas
Preguntas frecuentes
¿properties hace obligatorio un campo?
No. required exige presencia y properties restringe el valor. Un null presente no es lo mismo que un campo ausente.
¿additionalProperties: false afecta a todos los objetos anidados?
No. Afecta al objeto cuyo esquema lo contiene. Define los contratos anidados y revisa cómo compones esquemas.