mygems

Cómo arreglar un JSON inválido: cada error común, explicado

Unexpected token, coma final, comillas simples, comentarios no permitidos. Qué significa cada error de JSON, cómo hallar la línea y cómo corregirlo.

Por mygems ·

JSON es estricto de una forma que parece quisquillosa hasta que se conocen las reglas. Sin comas finales. Solo comillas dobles. Sin comentarios. Las claves deben ir entre comillas. Rompa una sola de ellas, en cualquier parte, y el documento entero se rechaza con un mensaje que señala una posición de carácter y rara vez dice qué está mal.

Esta página relaciona los mensajes de error con sus causas, y las causas con sus soluciones.

La respuesta rápida

  1. Encuentre la posición. Todo analizador (parser) informa de una línea y una columna, o de un desplazamiento en caracteres. Vaya allí; el error está en ese punto o justo antes.
  2. Busque los cinco habituales: una coma final, comillas simples, una clave sin comillas, un comentario, o una coma que falta entre dos elementos.
  3. Si el error está en la posición 0 o en la línea 1, columna 1, el problema no es el JSON. Recibió otra cosa: una página de error HTML, una respuesta vacía o una marca de orden de bytes (BOM).

Para obtener una ubicación precisa en cualquier equipo:

python3 -m json.tool broken.json
jq . broken.json

Cómo leer el mensaje de error

El mismo error se lee distinto en cada lenguaje. Encuentre el suyo y luego la causa:

Mensaje (abreviado)Dónde lo veráCausa habitual
Unexpected token '<', "<!DOCTYPE"... is not valid JSONJavaScriptRecibió una página HTML, no JSON. Vea más abajo
Unexpected end of JSON inputJavaScriptRespuesta vacía, o el archivo quedó cortado
Expected double-quoted property nameJavaScriptComa final antes de }, o una clave sin comillas o con comillas simples
Unexpected non-whitespace character after JSONJavaScriptDos documentos seguidos, o basura después de la llave de cierre
Bad control character in string literalJavaScriptUn tabulador o salto de línea literal dentro de una cadena
Expecting value: line 1 column 1 (char 0)PythonEntrada vacía, o que no es JSON en absoluto
Expecting property name enclosed in double quotesPythonComa final, comillas simples o clave sin comillas
Expecting ',' delimiterPythonFalta una coma entre dos elementos o miembros
Extra dataPythonMás de un documento en el archivo (a menudo NDJSON)
Invalid control characterPythonUn tabulador o salto de línea literal dentro de una cadena
Unexpected UTF-8 BOMPythonMarca de orden de bytes invisible al inicio del archivo

Las causas, una por una

Coma final

{ "name": "Ada", "role": "admin", }

Permitida en código JavaScript, prohibida en JSON. El analizador llega a } cuando espera otra clave. Borre la última coma. Los archivos de configuración editados a mano y el código que construye JSON concatenando cadenas son las fuentes habituales.

Comillas simples

{ 'name': 'Ada' }

Las cadenas JSON siempre usan comillas dobles. Suele venir de un dict de Python mostrado con print() en lugar de json.dumps(). La solución real está en el código que lo produjo: serialice con una biblioteca JSON, no con formato de cadenas.

Claves sin comillas

{ name: "Ada" }

JavaScript válido, JSON inválido. Ponga comillas a todas las claves.

Comentarios

{ "port": 8080 // default }

JSON no tiene comentarios. Pero tenga cuidado antes de «arreglarlo»: algunos archivos están pensados para tenerlos. tsconfig.json, el settings.json de VS Code y muchos otros archivos de configuración son JSONC (JSON con comentarios) o JSON5, y las herramientas que los leen aceptan comentarios. Si el archivo es uno de esos, el problema es el analizador estricto al que se lo está dando, no el archivo.

Una coma que falta

{ "a": 1 "b": 2 }

El analizador lo reporta en "b", que está después del error. Cuando un error apunta a una clave perfectamente buena, mire el final de la línea anterior.

Valores que JSON no tiene

NaN, Infinity, undefined y los números con ceros a la izquierda como 007 son inválidos. También lo es un número hexadecimal, 0xFF. Use null, una cadena o un decimal simple, según lo que espere el lector.

Saltos de línea y tabuladores literales dentro de una cadena

Una cadena debe escribir los saltos de línea como \n y los tabuladores como \t. Un salto de línea real entre comillas es inválido. Suele ocurrir cuando se pega a mano un valor de varias líneas en un archivo JSON.

Barras invertidas

Una ruta de Windows como "C:\new\folder" falla, porque \n y \f son secuencias de escape. Duplique cada barra invertida, "C:\\new\\folder", o use barras normales.

Comillas tipográficas

“name” parece una cadena, pero no lo es: son comillas tipográficas, no ". Vienen de copiar JSON desde un documento, una app de chat o una diapositiva, o de escribir en un iPhone o iPad, donde la puntuación inteligente sustituye las comillas rectas mientras escribe. Desactívela en Ajustes → General → Teclado antes de editar JSON en iOS.

Errores en la «posición 0»: no es JSON

Cuando el error está en el primer carácter, lo que está mal es el contenido, no la sintaxis.

  • < en la posición 0 significa que analizó HTML. El servidor devolvió una página de error, una de inicio de sesión o un 404, y su código intentó leerla como JSON. Registre la respuesta sin procesar y el código de estado antes de analizar.
  • Una entrada vacía significa que la respuesta no tenía cuerpo, a menudo un 204 No Content o una solicitud que falló antes de que el servidor respondiera.
  • Un carácter invisible al inicio suele ser una marca de orden de bytes UTF-8 añadida por un editor de Windows. En Python, abra el archivo con encoding="utf-8-sig"; en otros casos, vuelva a guardarlo como UTF-8 sin BOM.

NDJSON no es JSON roto

Un archivo con un objeto JSON por línea (.jsonl, .ndjson o salida de registros) falla con «Extra data» o «Unexpected non-whitespace» al inicio de la línea dos. Cada línea es válida por sí sola. Analícelo línea por línea, o deje que lo haga una herramienta que entienda el formato: jq -c . file.jsonl lee cada línea.

Reparar automáticamente

Para los descuidos comunes (comas finales, comillas simples, claves sin comillas, comentarios), la reparación automática es segura porque solo hay un significado razonable. Herramientas que lo hacen:

  • jsonrepair, una biblioteca de JavaScript y herramienta de línea de comandos.
  • La mayoría de los editores de código, mediante una extensión de JSON5 o «fix JSON».
  • Una app editora de JSON que valida mientras escribe.

La reparación automática no es segura con un archivo truncado. Una herramienta de reparación cerrará los corchetes abiertos y le entregará un documento válido al que le faltan datos. Vuelva a descargarlo o a exportarlo.

En iPhone y iPad, Smart Json muestra el error en lenguaje claro, con su línea y columna. Go lleva el cursor hasta allí, y Fix repara comentarios, comas finales, comillas simples y claves sin comillas con un solo toque.

Un documento JSON minificado en el editor con un aviso que dice Expected a quoted key but found a stray character, línea 1, columna 2, con los botones Go y Fix
El error, su ubicación y una solución
JSON Editor: Smart JsoniPhone y iPad

Nombra un error de JSON en palabras claras con su línea y columna, salta hasta él y repara comentarios, comas finales, comillas simples y claves sin comillas con un solo toque.

Qué hace

Cómo evitar que se rompa

Casi todos los archivos JSON inválidos se escribieron a mano o se armaron concatenando cadenas. Genere JSON con un serializador (json.dumps, JSON.stringify, JSONEncoder) y valide los archivos editados a mano antes de confirmarlos. Un hook de pre-commit que ejecute jq . file.json > /dev/null detecta todo lo anterior antes de que lo vea otra persona.

Preguntas

¿Qué significa «Unexpected token < in JSON at position 0»?
Analizó HTML, no JSON. El servidor devolvió una página de error, una de inicio de sesión o un 404, y su código intentó leerla como JSON. Registre la respuesta sin procesar y su código de estado antes de llamar al analizador.
¿Se permiten comas finales en JSON?
No. Una coma después del último elemento de un objeto o arreglo invalida el documento, aunque el código JavaScript lo permita. Quite la coma final. Los formatos JSON5 y JSONC sí la permiten, pero los analizadores JSON estándar no.
¿Puede JSON tener comentarios?
El JSON estándar no. Algunos formatos de configuración basados en él, como JSONC (usado por VS Code y tsconfig.json) y JSON5, permiten comentarios, y las herramientas que leen esos archivos los aceptan. Un analizador JSON estricto los rechazará.
¿Cómo encuentro dónde es inválido mi JSON?
Páselo por un validador que indique la ubicación: python3 -m json.tool file.json o jq . file.json en la línea de comandos, o un editor de JSON que subraye el error. El error está en la posición indicada o justo antes, normalmente al final de la línea anterior.
¿Por qué mi JSON es inválido si parece correcto?
Busque caracteres que parecen correctos pero no lo son: comillas tipográficas en lugar de rectas (comunes tras copiar de un documento o escribir en un iPhone), una marca de orden de bytes invisible al inicio del archivo, o un tabulador literal dentro de una cadena.
¿Se puede reparar automáticamente un JSON inválido?
Los descuidos comunes sí: las comas finales, las comillas simples, las claves sin comillas y los comentarios tienen cada uno un único significado obvio, y herramientas como jsonrepair los corrigen sin riesgo. Un archivo truncado no se puede reparar con seguridad, porque la herramienta cerrará los corchetes y perderá en silencio los datos que faltan.

mygems — Desarrolla Smart Json, cuyo analizador escrito a mano nombra cada uno de estos errores con su línea y columna, y repara los más comunes.