Validador de JSON Schema (básico)
Cole um JSON Schema e um JSON e veja, em tempo real, quais campos não cumprem as regras. Esta ferramenta cobre um subconjunto do JSON Schema.
Processamento local: nada do que você digita sai do seu navegador.
Como usar
Cole o schema à esquerda e o JSON à direita. A validação roda a cada tecla. Cada erro mostra o caminho do campo (por exemplo $.itens[1].preco, em que $ é a raiz) e o que está errado. Se um dos textos não for JSON válido, mostramos a linha e a coluna do problema.
Palavras-chave suportadas
type(string, number, integer, boolean, null, object, array, ou lista de tipos)properties,requiredeadditionalPropertiesenumeconstminimum,maximum,exclusiveMinimumeexclusiveMaximumminLength,maxLengthepatternitems(um schema para todos os itens),minItemsemaxItems
Limitações
É um subconjunto. Não avaliamos $ref, oneOf, anyOf, allOf, not, if/then/else, format, uniqueItems, patternProperties, dependencies e similares. Quando o schema usa algo disso, avisamos qual palavra-chave foi ignorada, pois um resultado "válido" pode então não ser definitivo. Para uso em produção, utilize uma biblioteca completa (veja os exemplos de código).
Como implementar em código
Exemplos prontos para usar no seu projeto.
// npm install ajv
import Ajv from 'ajv';
const schema = {
type: 'object',
required: ['nome', 'idade'],
properties: {
nome: { type: 'string', minLength: 2 },
idade: { type: 'integer', minimum: 0, maximum: 130 },
},
};
const ajv = new Ajv({ allErrors: true }); // allErrors: lista todos os erros, não só o primeiro
const validar = ajv.compile(schema);
if (!validar({ nome: 'A', idade: 150 })) {
for (const e of validar.errors) console.log(e.instancePath || '/', e.message);
}# pip install jsonschema
from jsonschema import Draft202012Validator
schema = {
"type": "object",
"required": ["nome", "idade"],
"properties": {
"nome": {"type": "string", "minLength": 2},
"idade": {"type": "integer", "minimum": 0, "maximum": 130},
},
}
validador = Draft202012Validator(schema)
for erro in validador.iter_errors({"nome": "A", "idade": 150}):
print("/".join(map(str, erro.path)) or "(raiz)", "->", erro.message)package main
// go get github.com/santhosh-tekuri/jsonschema/v5
import (
"encoding/json"
"fmt"
"strings"
"github.com/santhosh-tekuri/jsonschema/v5"
)
const schemaJSON = `{
"type": "object",
"required": ["nome", "idade"],
"properties": {
"nome": {"type": "string", "minLength": 2},
"idade": {"type": "integer", "minimum": 0, "maximum": 130}
}
}`
func main() {
c := jsonschema.NewCompiler()
_ = c.AddResource("schema.json", strings.NewReader(schemaJSON))
sch, err := c.Compile("schema.json")
if err != nil {
panic(err)
}
var dados any
_ = json.Unmarshal([]byte(`{"nome":"A","idade":150}`), &dados)
if err := sch.Validate(dados); err != nil {
fmt.Println(err) // descreve cada violação
}
}// pubspec.yaml: dependencies: json_schema: ^5.1.0
import 'dart:convert';
import 'package:json_schema/json_schema.dart';
void main() {
final schema = JsonSchema.create({
'type': 'object',
'required': ['nome', 'idade'],
'properties': {
'nome': {'type': 'string', 'minLength': 2},
'idade': {'type': 'integer', 'minimum': 0, 'maximum': 130},
},
});
final dados = jsonDecode('{"nome":"A","idade":150}');
final resultado = schema.validate(dados);
if (!resultado.isValid) {
for (final e in resultado.errors) {
print('${e.instancePath}: ${e.message}');
}
}
}// Maven: com.networknt:json-schema-validator
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.networknt.schema.*;
import java.util.Set;
public class SchemaCheck {
public static void main(String[] args) throws Exception {
String schemaJson = """
{"type":"object","required":["nome","idade"],
"properties":{"nome":{"type":"string","minLength":2},
"idade":{"type":"integer","minimum":0,"maximum":130}}}""";
ObjectMapper mapper = new ObjectMapper();
JsonSchema schema = JsonSchemaFactory.getInstance(SpecVersion.VersionFlag.V202012).getSchema(schemaJson);
JsonNode dados = mapper.readTree("{\"nome\":\"A\",\"idade\":150}");
Set<ValidationMessage> erros = schema.validate(dados);
erros.forEach(e -> System.out.println(e.getMessage()));
}
}<?php
// composer require opis/json-schema
require 'vendor/autoload.php';
use Opis\JsonSchema\Validator;
$schema = '{"type":"object","required":["nome","idade"],
"properties":{"nome":{"type":"string","minLength":2},
"idade":{"type":"integer","minimum":0,"maximum":130}}}';
$dados = json_decode('{"nome":"A","idade":150}'); // objeto, não array
$resultado = (new Validator())->validate($dados, $schema);
if (!$resultado->isValid()) {
echo $resultado->error()->message(), PHP_EOL;
}// dotnet add package JsonSchema.Net
using System;
using System.Text.Json.Nodes;
using Json.Schema;
class Program
{
static void Main()
{
var schema = JsonSchema.FromText("""
{"type":"object","required":["nome","idade"],
"properties":{"nome":{"type":"string","minLength":2},
"idade":{"type":"integer","minimum":0,"maximum":130}}}
""");
var dados = JsonNode.Parse("{\"nome\":\"A\",\"idade\":150}");
var resultado = schema.Evaluate(dados, new EvaluationOptions { OutputFormat = OutputFormat.List });
Console.WriteLine(resultado.IsValid ? "válido" : "inválido");
}
}A API do JsonSchema.Net mudou entre versões maiores; confira a documentação da versão instalada.
Perguntas frequentes
Qual versão do JSON Schema é usada?
As palavras-chave suportadas têm o mesmo significado nos drafts recentes (07, 2019-09 e 2020-12), mas a ferramenta implementa só um subconjunto e não lê o $schema.
Por que 1.0 é aceito como integer?
Em JavaScript, 1.0 e 1 são o mesmo número, e o JSON Schema moderno considera inteiro qualquer número sem parte fracionária. Já 1.5 é rejeitado como integer.
Meus dados saem do navegador?
Não. O schema e o JSON são processados localmente, sem envio a servidor.
Veja também
Precisa de um sistema ou app sob medida?
A VcInova desenvolve software, aplicativos e integrações para empresas de todo o Brasil.
Fale com a VcInova