Validador de JSON Schema
Pega un esquema a la izquierda y un documento a la derecha y sabrás si el documento valida y, si no, dónde y por qué exactamente. Cada error es una fila: el JSON Pointer dentro del documento, la palabra clave que falló, el punto del esquema del que salió, el valor que había y, lo que un puntero por sí solo nunca da, la línea del texto pegado a la que apunta. Las filas van en el orden en que leerías el archivo, así que la primera es el primer problema al que llegarías bajando. Lo que distingue a esta herramienta es cómo informa anyOf y oneOf. La mayoría de validadores los aplana: un valor que falla en tres ramas produce todas las quejas de las tres en una lista indiferenciada y la frase útil queda enterrada. Aquí el fallo sigue siendo una fila, con las ramas debajo, cada una descrita por lo que pide y con sus propios errores, y la que estuvo más cerca — la de menos problemas — marcada, porque casi siempre es la que querías. Un oneOf que encaja en dos ramas se informa como su propio fallo y nombra las ramas. El draft importa más de lo que parece, así que la herramienta muestra cuál usó y cómo lo eligió: el $schema del esquema si lo hay, y si no el que selecciones. En draft 4, 1.0 no es un entero y exclusiveMinimum es un booleano que modifica a minimum; desde draft 6, 1.0 sí es entero y exclusiveMinimum lleva el límite. En draft 7 y anteriores se ignora cualquier palabra clave escrita al lado de un $ref. Otras respuestas sorprenden igual en todos los drafts: required habla de presencia, así que una propiedad puesta a null lo cumple; minLength cuenta puntos de código, así que un emoji es uno y un acento descompuesto son dos; 0.3 no es múltiplo de 0.1 en coma flotante binaria; y dos objetos que solo difieren en el orden de las claves son el mismo valor, mientras que dos arrays en distinto orden no. Un esquema también puede estar roto en vez de ser estricto, y esa es otra respuesta. Un nombre de tipo mal escrito, un required que no es array, un pattern que no compila o un $ref que no resuelve se informan como fallo del esquema, con un puntero al sitio, en lugar de convertirse en un documento que pasa o falla. Lo que no puede decirte: aquí no se descarga nada, así que un $ref a una URL no se resuelve y hay que traerlo a $defs; unevaluatedProperties, unevaluatedItems y $dynamicRef se señalan y se omiten en vez de adivinarse; los enteros por encima de 2^53 se leen como dobles, cosa que un validador de servidor no hace; y los patrones corren en el motor de expresiones regulares del navegador, que es el que pide la especificación pero difiere de Python o Go en los bordes. Todo ocurre en la página: ni el esquema ni el documento salen de tu equipo.
Si el esquema declara $schema, ese draft manda; este ajuste solo se usa cuando no lo declara.
Resultado
No válido
Errores
7
Draft
2020-12
Documento
12 líneas, 169 bytes
El esquema no permite otras propiedades y están estas: "debug"
debug (línea 11)
valor: {"name":"","version":"2.1","server":{"host":"0.0.0.0","port":99999,"tls":"yes"},"workers":…
esquema: /additionalProperties
La cadena tiene 0 puntos de código y el mínimo es 1
valor: ""
esquema: /properties/name/minLength
"2.1" no coincide con el patrón ^\d+\.\d+\.\d+$
valor: "2.1"
esquema: /properties/version/pattern
99999 es mayor que el máximo de 65535
valor: 99999
esquema: /properties/server/properties/port/maximum
"yes" es de tipo string y el esquema pide boolean
valor: "yes"
esquema: /properties/server/properties/tls/type
Ninguna de las 2 ramas de anyOf acepta este valor
valor: 0
esquema: /properties/workers/anyOf
Rama 1 type: integer 1 problemasla más cercana
- /workers — 0 es menor que el mínimo de 1
Rama 2 const: "auto" 1 problemas
- /workers — 0 no es la constante "auto"
Los elementos con índice 0 e índice 1 son el mismo valor: "a"
valor: ["a","a"]
esquema: /properties/tags/uniqueItems
Todo se ejecuta en esta página: ni el esquema ni el documento se suben a ningún sitio.
Cómo usar
- Pega el esquema en el primer recuadro y el documento que quieres comprobar en el segundo. Ambos se guardan, así que puedes cerrar la página y volver.
- Mira las fichas del resumen: válido o no, cuántos errores, qué draft se usó y el tamaño del documento. La línea del draft dice también si vino del $schema o del selector.
- Recorre las filas de error. Cada una da el JSON Pointer, la línea de tu documento, la palabra clave que falló, el valor que había y el sitio dentro del esquema, para que puedas arreglar cualquiera de los dos lados.
- Abre una fila de anyOf o oneOf y lee las ramas. La marcada como la más cercana es la que falló en menos cosas, que suele ser la que buscabas.
- Activa "Comprobar format" cuando quieras que format falle en vez de anotar: viene apagado porque la especificación lo define como anotación y la mayoría de validadores lo dejan así.
Preguntas frecuentes
- ¿Por qué pasa mi documento si esperaba que fallara?
- Casi siempre porque el esquema dice menos de lo que parece. JSON Schema ignora las palabras clave que no conoce, así que "require" en vez de "required", "minlength" en vez de "minLength" o una palabra de 2020-12 dentro de un esquema draft-07 no son un error: son una anotación que no hace nada. Los objetos además aceptan propiedades extra salvo que additionalProperties o unevaluatedProperties lo impida, los arrays aceptan cualquier cosa si no hay items ni prefixItems, y format solo anota hasta que activas la comprobación. Mira también el draft de las fichas: una palabra clave puede existir en un draft y no en otro, y aquí se ignora la que el draft elegido nunca tuvo.
- ¿1.0 es un entero?
- Desde draft 6, sí: la especificación define "integer" por el valor, así que 1.0 y 1.0e2 son enteros y 1.5 no. En draft 4, no: un número escrito con parte decimal es un float y falla "type": "integer". Esta herramienta conserva cómo estaba escrito cada número al analizarlo, que es lo único que permite distinguir 1 de 1.0, porque JSON.parse da el mismo valor para ambos. Si validas con una librería antigua contra un esquema draft-04, esa diferencia causa sorpresas reales en producción, y cambiando el selector de draft aquí la reproduces.
- ¿Por qué 0.3 no es múltiplo de 0.1?
- Porque ninguno de los dos números es exacto en coma flotante binaria. 0.3 dividido entre 0.1 da 2.9999999999999996, no 3, y los validadores de referencia comprueban justo ese cociente, así que rechazan el documento. El mismo esquema escrito como "multipleOf": 1 con el valor escalado a 3 pasa sin problema. No es una manía de esta herramienta: python-jsonschema, ajv y los demás se comportan igual con un multipleOf decimal, por eso un esquema que quiere decir "dos decimales" se escribe mejor como pattern o como un entero de céntimos.
- ¿Cómo se lee el JSON Pointer de un error?
- Un puntero es una ruta de tokens separados por barras desde la raíz del documento: /server/port es el miembro port del objeto server y /tags/2 es el tercer elemento de tags, porque los índices empiezan en cero. Un puntero vacío significa el documento entero, y por eso los errores de required, additionalProperties o uniqueItems apuntan al objeto o al array que los contiene y no al miembro: la propiedad que falta no tiene sitio propio. Una barra dentro de un nombre de propiedad se escribe ~1 y una virgulilla ~0. El número de línea junto al puntero es esta herramienta resolviendo esa ruta en el texto exacto que pegaste.
- ¿Por qué otros validadores sacan tantos errores con anyOf?
- Porque un anyOf fallido falló de verdad en todas las ramas y todos esos errores son ciertos. Un validador sin criterio los imprime uno detrás de otro, así que una unión de cadena y objeto acaba en una lista donde "no es de tipo string" convive con una queja por una propiedad ausente de un objeto que nunca quisiste. Agruparlos por rama devuelve la estructura que el esquema ya tenía, y elegir la rama con menos fallos te lleva a la buena casi siempre. Es una heurística, no una prueba: si dos ramas fallan en una cosa cada una, se marca la primera, y el esquema no puede decir cuál pretendías.
- ¿Puede seguir un $ref a otro archivo o a una URL?
- No, y es deliberado: aquí nada toca la red, así que un $ref a https://example.com/user.json, o a un archivo vecino como common.json#/$defs/id, no se puede resolver y se informa como fallo del esquema en lugar de ignorarse en silencio. Las referencias dentro del texto pegado funcionan por completo: #/$defs/name, un # a secas, una referencia recursiva a la raíz, un $anchor y un $id al que apunte otra referencia. Para comprobar un esquema repartido en archivos, empaquétalo antes: pega las definiciones en $defs y reapunta las referencias, que es lo que hace casi todo el tooling antes de publicar un esquema.
Herramientas relacionadas
Inspector de almacenes PKCS#12
Abre un .p12 o .pfx en el navegador: MAC y cifrados antes de la contraseña, y luego la cadena, la clave privada y si se corresponden.
Generador de esquemas Zod desde JSON
Convierte un objeto JSON en un esquema de validación Zod con tipos inferidos, en tu navegador.
Generador de JSON Schema
Pega cualquier JSON y obtén un JSON Schema draft-07 que coincide con su forma — tipos inferidos, formatos detectados, campos required.
Probador JSONPath
Ejecuta queries JSONPath (`$.store.book[*].author`, `$..price`) contra un documento de muestra y mira los valores que coinciden.
Resolutor de JSON Pointer (RFC 6901)
Resuelve un JSON Pointer RFC 6901 como /user/roles/0 contra un documento — con escape ~0/~1, fragmentos URI y una lista clicable de cada puntero.
Constructor de JSON Patch (RFC 6902)
Genera un JSON Patch RFC 6902 desde un par source/target, o aplica un patch existente a un documento. Soporta ops add, remove, replace, move, copy, test.