JSON Schema es un estándar para describir, validar y documentar la estructura de un documento JSON.
Permite definir qué campos existen, qué tipo de datos tienen y qué restricciones deben cumplir. Es equivalente a un “contrato” entre quien envía y quien recibe el JSON.
Sirve para validar automáticamente datos en APIs REST, formularios web o bases de datos NoSQL.
JSON a validar
{
"nombre": "Ana",
"edad": 28,
"activo": true
}
JSON Schema correspondiente
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"nombre": { "type": "string" },
"edad": { "type": "integer", "minimum": 0 },
"activo": { "type": "boolean" }
},
"required": ["nombre", "edad"]
}
Significado:
El objeto debe tener propiedades nombre
, edad
, activo
.
nombre
debe ser string; edad
entero ≥ 0; activo
booleano.
nombre
y edad
son obligatorios.
type
— Define el tipo (string, number, integer, boolean, null, object, array).properties
— Define las claves de un objeto y sus restricciones.required
— Lista de campos obligatorios.items
— Estructura de los elementos de un array.minimum
, maximum
, minLength
, maxLength
— Restricciones numéricas y de texto.enum
— Lista de valores permitidos.pattern
— Validación con expresiones regulares para strings.JSON a validar
{
"email": "user@example.com",
"rol": "admin",
"edad": 25
}
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"email": { "type": "string", "format": "email" },
"rol": { "type": "string", "enum": ["admin", "editor", "usuario"] },
"edad": { "type": "integer", "minimum": 18, "maximum": 99 }
},
"required": ["email", "rol"]
}
Validaciones:
email
debe tener formato válido.
rol
debe ser uno de los valores permitidos.
edad
debe estar entre 18 y 99.
JSON a validar
{
"tags": ["tecnología", "json", "api"]
}
JSON Schema
{
"type": "object",
"properties": {
"tags": {
"type": "array",
"items": { "type": "string" },
"minItems": 1,
"uniqueItems": true
}
}
}
JSON a validar
{
"usuario": {
"nombre": "María",
"direccion": {
"calle": "San Martín",
"numero": 123,
"ciudad": "Córdoba"
}
}
}
JSON Schema
{
"type": "object",
"properties": {
"usuario": {
"type": "object",
"properties": {
"nombre": { "type": "string" },
"direccion": {
"type": "object",
"properties": {
"calle": { "type": "string" },
"numero": { "type": "integer" },
"ciudad": { "type": "string" }
},
"required": ["calle", "numero"]
}
},
"required": ["nombre", "direccion"]
}
}
}
JSON válido
{
"tienda": "Tech Store",
"productos": [
{
"codigo": 101,
"descripcion": "Teclado",
"precio": 1200.50,
"disponible": true,
"categorias": ["periféricos", "ofertas"]
}
]
}
JSON Schema
{
"type": "object",
"properties": {
"tienda": { "type": "string" },
"productos": {
"type": "array",
"items": {
"type": "object",
"properties": {
"codigo": { "type": "integer" },
"descripcion": { "type": "string", "minLength": 3 },
"precio": { "type": "number", "minimum": 0 },
"disponible": { "type": "boolean" },
"categorias": {
"type": "array",
"items": { "type": "string" }
}
},
"required": ["codigo", "descripcion", "precio"]
}
}
},
"required": ["tienda", "productos"]
}
from jsonschema import validate, ValidationError
schema = {
"type": "object",
"properties": {
"nombre": {"type": "string"},
"edad": {"type": "integer", "minimum": 0}
},
"required": ["nombre", "edad"]
}
data = {"nombre": "Ana", "edad": 25}
try:
validate(instance=data, schema=schema)
print("JSON válido")
except ValidationError as e:
print("Error:", e.message)
Lib: jsonschema.
import Ajv from "ajv";
const ajv = new Ajv();
const schema = {
type: "object",
properties: {
nombre: { type: "string" },
edad: { type: "integer", minimum: 0 }
},
required: ["nombre", "edad"]
};
const validate = ajv.compile(schema);
const valid = validate({ nombre: "Ana", edad: 25 });
console.log(valid ? "JSON válido" : "Error", validate.errors);
Lib: AJV.