Validador de JSON
Cada error con su línea, columna, causa y solución exactas.
Nada de lo que pegues sale de tu navegador. La lista de permitidos de connect-src convierte eso en una garantía del navegador, no en una promesa. Compruébalo tú mismo
Validar responde a una única pregunta: ¿es este un documento JSON legal? La parte útil llega cuando la respuesta es no. La mayoría de validadores te dicen que un token era inesperado y te dejan buscarlo. Este te dice qué carácter, en qué línea y columna, qué esperaba en su lugar y qué hacer al respecto.
Tampoco se detiene en el primer problema. Un documento con cuatro fallos reporta cuatro fallos, así que los arreglas en una pasada y no en cuatro.
Qué se comprueba
La gramática de la RFC 8259, completa. Incluidas las partes que sorprenden a mucha gente.
- Espacios en blanco
- Entre tokens solo son legales cuatro caracteres: espacio, tabulación, retorno de carro y salto de línea. Un espacio de no separación, un espacio de ancho cero o un espacio ideográfico son errores de sintaxis, y este validador nombra el carácter en vez de reportar un token inesperado. Llegan continuamente al copiar JSON de una página web, un PDF o un cliente de chat.
- Números
- Sin ceros a la izquierda, sin signo más inicial, sin hexadecimal, sin punto decimal final, sin NaN ni Infinity. Cada infracción recibe su propio mensaje, porque cada una tiene una causa distinta y una solución distinta.
- Cadenas
- Solo son legales nueve secuencias de escape. Los caracteres de control por debajo de U+0020 deben ir escapados. Los sustitutos sueltos se marcan como aviso, porque se parsean pero no sobreviven a una recodificación a UTF-8.
- Un único valor de nivel superior
- Un documento contiene exactamente uno. Varios valores, uno por línea, es NDJSON, y este validador reconoce esa forma y lo dice en vez de reportar un error genérico de contenido sobrante.
Avisos, que no son errores
Algunas cosas se parsean y aun así te arruinan la tarde. Se reportan por separado para que nunca bloqueen tu salida.
- Claves duplicadas
- La RFC 8259 dice que las claves DEBERÍAN ser únicas y deja el comportamiento sin definir cuando no lo son. JavaScript y Python se quedan con la última, algunos parsers de Go y Java rechazan el documento, y unos pocos se quedan con la primera. Aquí obtienes la posición de ambas.
- Enteros fuera del rango seguro
- Por encima de 2^53-1 un número de JavaScript no puede contener el valor exacto. El aviso indica qué valor te daría JSON.parse en su lugar.
- Marca de orden de bytes
- Un U+FEFF inicial se acepta aquí y se reporta, porque JSON.parse en navegadores y en Node lo rechaza de plano.
- Anidamiento muy profundo
- Este parser es iterativo y no tiene límite de profundidad, pero muchos consumidores sí lo tienen. Medido en esta máquina, V8 se niega a serializar una estructura de más de unos 4.800 niveles, así que un documento que puedes leer puede seguir siendo uno que no puedes volver a escribir.
Validar la forma además de la sintaxis
La validación sintáctica solo te dice que el documento está bien formado, no que contenga lo que esperabas. Para eso necesitas JSON Schema, que describe propiedades obligatorias, tipos y restricciones. Nuestro generador de esquemas produce un punto de partida a partir de un payload de ejemplo.
How to do this in code
Comprobar la validez en código, y sacar de ahí un error que sirva de algo.
js JavaScript
No hay validador sin excepciones en la biblioteca estándar, así que el try/catch es la API.
function validate(text) {
try {
JSON.parse(text);
return { ok: true };
} catch (e) {
// Modern V8 includes a (line L column C) suffix in the message.
return { ok: false, message: e.message };
}
} py Python
JSONDecodeError lleva msg, lineno, colno, pos y doc, que es más estructura de la que dan la mayoría de entornos.
import json
try:
json.loads(text)
except json.JSONDecodeError as e:
print(f"{e.msg} at line {e.lineno} column {e.colno} (char {e.pos})") sh Shell
jq empty parsea la entrada y no imprime nada, lo que lo convierte en una comprobación de validez limpia dentro de un script de CI.
# jq exits non-zero and prints the position on failure
jq empty input.json
# Python, no extra install
python -m json.tool input.json > /dev/null go Go
Go informa de un desplazamiento en bytes en lugar de una línea, así que tienes que contar los saltos tú.
if !json.Valid(data) {
// Valid() gives no position. To get one, decode and
// inspect the SyntaxError:
var v any
if err := json.Unmarshal(data, &v); err != nil {
var se *json.SyntaxError
if errors.As(err, &se) {
line := 1 + bytes.Count(data[:se.Offset], []byte("\n"))
return fmt.Errorf("%v at line %d", se, line)
}
}
} Preguntas frecuentes
- ¿Por qué reporta varios errores cuando otros validadores reportan uno?
- Porque el parser se recupera en vez de detenerse. Tras reportar un problema se resincroniza y continúa, así que un documento con una coma final, una cadena entre comillas simples y una clave sin comillas reporta los tres en una sola pasada.
- ¿Es válido un número o una cadena suelta como JSON completo?
- Sí, desde la RFC 7159 en 2014. La RFC 4627 original exigía que el valor de nivel superior fuese un objeto o un array; la especificación actual, la RFC 8259, permite cualquier valor. Así que "hola", 42 y null son documentos JSON completos y válidos.
- ¿Se permiten alguna vez las comas finales?
- En JSON no. Sí se permiten en JavaScript, en JSON5 y en JSONC, que es lo que usa VS Code para sus propios archivos de configuración. Si quien consume tu documento acepta JSONC puedes dejarlas; si no, la herramienta de reparación las elimina.
- ¿Y los comentarios?
- JSON no tiene, por diseño. Douglas Crockford los quitó a propósito, con el argumento de que la gente los estaba usando para meter directivas de parseo. Usa JSONC o JSON5, o mueve la nota a una clave como "_comment".