ToolHub
View All Posts

Referencia ao Schema com o $id especificado.

Cada aplicação que recebe datos de fuentes externas enfrenta a mesma pergunta fundamental: posso confiar em estes datos? Ya sejam corpos de requisição API, arquivos de configuração, mensajes de cola o importaciones de datos, os datos no confiáveis devem validarse antes de ingresar a tua sistema. JSON Schema proporciona uma forma estandarizada e independiente do lenguaje para definir como se veem os datos válidos e validar que os datos entrantes se ajusten a essa definição. Esta guia cobre todo, desde escrever tua primer Schema até patrones avanzados de validação compleja, com exemplos práticos que podes aplicar imediatamente.

Novo em Draft 2020-12. Soporta referencias dinámicas a Schemas.

JSON Schema é um documento JSON que descreve a estrutura e as restricciones de outros documentos JSON. É um vocabulario que te permite anotar e validar datos JSON, estandarizado por o Internet Engineering Task Force (IETF). JSON Schema define regras sobre quê campos devem existir, que tipos devem ter, que valores são aceitáveis e como devem estructurarse os objetos e arrays.

Pensa em JSON Schema como o contrato de tuas datos. Así como um esquema de base de datos define as columnas, tipos e restricciones de uma tabla, JSON Schema define as propriedades, tipos e restricciones dois documentos JSON. Qualquer dato JSON que cumpla todas as restricciones do Schema se chama instancia válida, enquanto que os datos que violan qualquer restricção são inválidos.

OpenAPI (extensão)

Faz referencia a um Schema desde um arquivo externo.

JSON Schema ha evolucionado através de múltiples borradores, cada um adicionando funcionalidades e refinando o vocabulario. Compreender estas versiones te ajuda a escolher a correta para tua projeto e evitar problemas de compatibilidade.

Versão$schema URIEstadoCaracterísticas principais
Draft 2020-12https://json-schema.org/draft/2020-12/schemaVersão actualprefixItems, dynamicRef, soporte de vocabulario
Draft 2019-09https://json-schema.org/draft/2019-09/schemaEstávelunevaluatedProperties, $recursiveRef
Draft 7http://json-schema.org/draft-07/schema#Ampliamente soportadoif/then/else, contentEncoding
Draft 6http://json-schema.org/draft-06/schema#LegadopropertyNames, contains
Draft 4http://json-schema.org/draft-04/schema#ObsoletoPrimera versão ampliamente adoptada
Recomendação: Usa Draft 2020-12 para novos projetos. É a última versão estável com mais funcionalidades e soporte dois principais validadores. Se necessitas máxima compatibilidade com ferramentas existentes, Draft 7 é uma opção segura. Evita Draft 4 e versiones anteriores.

sem espaço

Comencemos com um exemplo simple: um Schema para um objeto de usuario com nombre, email e edade.

{
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "$id": "https://example.com/schemas/user.json",
    "title": "User",
    "description": "A user account in the system",
    "type": "object",
    "properties": {
        "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100,
            "description": "The user's full name"
        },
        "email": {
            "type": "string",
            "format": "email",
            "description": "The user's email address"
        },
        "age": {
            "type": "integer",
            "minimum": 0,
            "maximum": 150,
            "description": "The user's age in years"
        }
    },
    "required": ["name", "email"],
    "additionalProperties": false
}

Este Schema declara que um usuario válido deve ser um objeto onde name e email são propriedades de cadena requeridas. A propriedade age é opcional mas se está presente deve ser um inteiro entre 0 e 150. A restricção additionalProperties: false evita qualquer propriedade no definida no Schema, lo que detecta erros tipográficos e campos inesperados.

com espaço (recomendado)

JSON Schema proporciona um rico vocabulario de palavras clave para definir restricciones. Aquí estão as mais importantes, organizadas por categoria.

Schema por defecto para todos os elementos do array.

Palavras claveDescriçãoExemplo
typeTipo de dato esperado"type": "string" o "type": ["string", "null"]
enumLista de valores permitidos"enum": ["active", "inactive", "pending"]
constDeve ser igual a este valor exato"const": "v2"

Valida por tipo de elemento.

Palavras claveDescriçãoExemplo
minimumValor mínimo (inclusivo)"minimum": 0
exclusiveMinimumValor mínimo (exclusivo)"exclusiveMinimum": 0
maximumValor máximo (inclusivo)"maximum": 100
exclusiveMaximumValor máximo (exclusivo)"exclusiveMaximum": 100
multipleOfDeve ser múltiplo de este valor"multipleOf": 0.01

Verifica que os elementos do array sejam únicos.

Palavras claveDescriçãoExemplo
minLengthLongitud mínima de cadena"minLength": 1
maxLengthLongitud máxima de cadena"maxLength": 255
patternExpresão regular que a cadena deve coincidir"pattern": "^[A-Z]{2}\\d{4}$"
formatFormato semántico (email, uri, date-time, etc.)"format": "email"

Verifica que o array tenga pelo menos um elemento.

Palavras claveDescriçãoExemplo
propertiesSchema para cada propriedade conhecida"properties": {"name": {"type": "string"}}
requiredLista de propriedades requeridas"required": ["name", "email"]
additionalPropertiesSe se permitem propriedades adicionales"additionalProperties": false
minPropertiesNúmero mínimo de propriedades"minProperties": 1
maxPropertiesNúmero máximo de propriedades"maxProperties": 10
patternPropertiesSchema para propriedades que coincidem com regex"patternProperties": {"^S_": {"type": "string"}}

Valida cada elemento contra todos os Schemas para detectar coincidencias.

Palavras claveDescriçãoExemplo
itemsSchema para todos os elementos do array"items": {"type": "string"}
prefixItemsSchema para elementos posicionales (Draft 2020-12)"prefixItems": [{"type": "string"}, {"type": "number"}]
minItemsNúmero mínimo de elementos"minItems": 1
maxItemsNúmero máximo de elementos"maxItems": 100
uniqueItemsTodos os elementos devem ser únicos"uniqueItems": true

Versão do Draft

Os Schemas do mundo real frequentemente requerem patrones que vão mais lá de a simple verificação de tipos. Aquí estão os patrones mais utilizados.

if/then/else para validação condicional

Usa lógica condicional para aplicar diferentes restricciones segundo os valores das propriedades. Por exemplo, um objeto de pago requer diferentes campos segundo o método de pago.

{
    "type": "object",
    "properties": {
        "method": { "enum": ["credit_card", "bank_transfer"] },
        "card_number": { "type": "string" },
        "routing_number": { "type": "string" }
    },
    "required": ["method"],
    "if": {
        "properties": { "method": { "const": "credit_card" } }
    },
    "then": {
        "required": ["card_number"]
    },
    "else": {
        "required": ["routing_number"]
    }
}

allOf, anyOf, oneOf para composição

As palavras clave de composição te permitem combinar Schemas de maneira potente:

{
    "oneOf": [
        {
            "type": "object",
            "properties": {
                "type": { "const": "email" },
                "address": { "type": "string", "format": "email" }
            },
            "required": ["type", "address"]
        },
        {
            "type": "object",
            "properties": {
                "type": { "const": "phone" },
                "number": { "type": "string", "pattern": "^\\+?[1-9]\\d{1,14}$" }
            },
            "required": ["type", "number"]
        }
    ]
}

$ref para reutilização de Schema

A palavra clave $ref te permite referenciar e reutilizar Schemas, eliminando a duplicação e mantendo os Schemas manteniveis. Podes referenciar Schemas dentro do mesmo documento o em arquivos externos.

{
    "$id": "https://example.com/schemas/order.json",
    "type": "object",
    "properties": {
        "customer": { "$ref": "#/$defs/address" },
        "shipping": { "$ref": "#/$defs/address" },
        "billing": { "$ref": "#/$defs/address" },
        "items": {
            "type": "array",
            "items": { "$ref": "#/$defs/lineItem" },
            "minItems": 1
        }
    },
    "required": ["customer", "items"],
    "$defs": {
        "address": {
            "type": "object",
            "properties": {
                "street": { "type": "string" },
                "city": { "type": "string" },
                "zip": { "type": "string", "pattern": "^\\d{5}(-\\d{4})?$" },
                "country": { "type": "string", "minLength": 2, "maxLength": 2 }
            },
            "required": ["street", "city", "zip", "country"]
        },
        "lineItem": {
            "type": "object",
            "properties": {
                "product": { "type": "string" },
                "quantity": { "type": "integer", "minimum": 1 },
                "price": { "type": "number", "exclusiveMinimum": 0 }
            },
            "required": ["product", "quantity", "price"]
        }
    }
}

Tipos nullavel

Em JSON Schema Draft 2020-12, os tipos nullavel se expresan usando um array de tipos que inclui "null":

{
    "type": ["string", "null"],
    "description": "An optional display name, or null if not set"
}

Em borradores anteriores, a especificação OpenAPI usaba a palavra clave nullavel: true. Para JSON Schema estándar, usa siempre o abordagem de array de tipos.

Sintaxe de nullavel

A palavra clave format proporciona validação semántica mais lá de a verificação estructural. Especifica que uma cadena deve ajustarse a um formato conhecido. Os formatos comumente soportados incluem:

FormatoDescriçãoExemplo
emailDirecção de correio electrónicouser@example.com
uriURI válidohttps://example.com/path
uri-referenceURI o referencia relativa/path/to/resource
date-timeFecha e hora ISO 86012026-05-19T14:30:00Z
dateFecha ISO 86012026-05-19
timeHora ISO 860114:30:00Z
ipv4Direcção IPv4192.168.1.1
ipv6Direcção IPv6::1
uuidIdentificador único universal550e8400-e29b-41d4-a716-446655440000
hostnameNombre de host de Internetwww.example.com
Importante: Por defecto, a palavra clave format é uma anotação, no uma restricção. Os validadores podem ignorarla a menos que habilites explicitamente a validação de formatos. Em Ajv, passa { strict: true } o { validateFormats: true } para forzar a verificação de formatos. Siempre verifica que tua validador aplique as restricciones de formato.

Draft 2020-12

A validação de Schema é mais útil quando se integra no código de tua aplicação. Aquí há exemplos usando bibliotecas populares em diferentes lenguajes.

JavaScript com Ajv

Ajv é o validador JSON Schema mais utilizado em JavaScript. Soporta todas as versiones de borrador e oferece um performance excelente através de a compilação JIT de Schemas.

import Ajv from 'ajv';
import addFormats from 'ajv-formats';

const ajv = new Ajv();
addFormats(ajv);

const schema = {
    type: 'object',
    properties: {
        name: { type: 'string', minLength: 1 },
        email: { type: 'string', format: 'email' },
        age: { type: 'integer', minimum: 0 }
    },
    required: ['name', 'email'],
    additionalProperties: false
};

const validate = ajv.compile(schema);
const valid = validate({ name: 'Alice', email: 'alice@example.com', age: 30 });

if (!valid) {
    console.log(validate.errors);
    // [{ keyword: 'required', params: { missingProperty: 'email' }, ... }]
}

Python com jsonschema

from jsonschema import validate, ValidationError

schema = {
    "type": "object",
    "properties": {
        "name": {"type": "string", "minLength": 1},
        "email": {"type": "string", "format": "email"},
        "age": {"type": "integer", "minimum": 0}
    },
    "required": ["name", "email"],
    "additionalProperties": False
}

try:
    validate(instance={"name": "Alice", "email": "alice@example.com"}, schema=schema)
except ValidationError as e:
    print(f"Validation failed: {e.message}")

Draft 7 e anteriores

Uma das aplicaciones mais valiosas de JSON Schema é validar datos de requisição e respuesta de API. Isto asegura que tua API reciba entradas bem formadas e devuelva datos no formato esperado, detectando erros temprano e proporcionando mensajes de error claros a os clientes.

Middleware de Express.js

import Ajv from 'ajv';

const ajv = new Ajv({ allErrors: true });

function validateBody(schema) {
    const validate = ajv.compile(schema);
    return (req, res, next) => {
        if (!validate(req.body)) {
            return res.status(400).json({
                error: 'Validation failed',
                details: validate.errors
            });
        }
        next();
    };
}

app.post('/api/users',
    validateBody({
        type: 'object',
        properties: {
            name: { type: 'string', minLength: 1, maxLength: 100 },
            email: { type: 'string', format: 'email' },
            role: { enum: ['admin', 'editor', 'viewer'] }
        },
        required: ['name', 'email'],
        additionalProperties: false
    }),
    (req, res) => {
        // req.body is guaranteed valid here
        createUser(req.body);
    }
);

OpenAPI e JSON Schema

OpenAPI (anteriormente Swagger) utiliza um subconjunto de JSON Schema para definir os Schemas de requisição e respuesta de API. Se ya estás usando OpenAPI, podes extrair Schemas de tua especificação API e usarlos para validação em tiempo de execução. Ferramentas como openapi-schema-validator e express-openapi-validator podem automatizar este proceso, asegurando que tua documentação API e lógica de validação permanezcan siempre sincronizadas.

Draft 4

Necessitas validar datos JSON contra um Schema? Experimenta nosso validador JSON Schema online gratuito. Pega tua Schema e tuas datos para obter resultados de validação instantáneos com mensajes de error detalhados.

Validador JSON SchemaFerramenta de formato JSON

Perguntas frequentes

Novo em Draft 2020-12. Soporta referencias dinámicas a Schemas.

JSON Schema é um documento JSON que descreve a estrutura e as restricciones de outros documentos JSON. Te permite definir campos requeridos, tipos de datos esperados, rangos de valores, patrones de cadena e estruturas de objetos anidados. Podes usarlo para validar datos entrantes, generar documentação e criar automaticamente interfaces de formulario.

Que versão de JSON Schema deveria usar?

Para novos projetos, usa JSON Schema Draft 2020-12. É a última versão estável e está soportada por os principais validadores como Ajv. Se necessitas compatibilidade com ferramentas mais antiguas, Draft 7 também tem soporte generalizado. Evita Draft 4 e versiones anteriores já que usam palavras clave obsoletas e carecem de funcionalidades modernas.

Qual é a diferença entre JSON Schema e as interfaces de TypeScript?

As interfaces de TypeScript solo proporcionam verificação de tipos em tiempo de compilação dentro do código TypeScript. JSON Schema proporciona validação em tiempo de execução através de lenguajes de programação, podendo validar datos de qualquer fuente (requisições API, arquivos, bases de datos). Usa TypeScript para segurança em tiempo de desenvolvimento e JSON Schema para validação de datos em tiempo de execução nos límites do sistema.

Pode JSON Schema validar corpos de requisição API?

Sí, JSON Schema se usa ampliamente para a validação de requisições e respuestas API. Frameworks como Express (com express-json-validator), FastAPI e Spring Boot soportan a validação JSON Schema de forma nativa o através de middleware. Validar os corpos de requisição contra um Schema asegura que os datos entrantes tengan a estrutura correta antes de que tua aplicação os procese.

Quais são as palavras clave mais importantes de JSON Schema?

As palavras clave mais críticas são: type (tipo de dato), properties (campos de objeto), required (campos obligatorios), items (Schema de elementos de array), minimum/maximum (límites numéricos), minLength/maxLength (límites de cadena), pattern (regex de cadena), enum (valores permitidos) e $ref (referencia para reutilizar Schemas). Estas palavras clave cobrem a gran maioria das necessidades de validação.