Saltar al contenido
jsonbeautifiers
Español

Reparar JSON

Arregla comas finales, comillas simples, comentarios y literales de Python, con la lista de cada cambio.

Filtrar con JSONPath

Sintaxis RFC 9535. El resultado reemplaza el panel desde el que abriste esta ventana.

 

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

Reparar toma algo que casi es JSON y lo hace válido. Comas finales, comillas simples, claves sin comillas, comentarios, literales de Python, comillas tipográficas, corchetes sin cerrar, espacios invisibles.

La salida no es lo interesante. Lo es el registro de cambios. Una herramienta de reparación que reescribe tu payload en silencio es peor que no tener ninguna, porque no puedes saber qué decidió por ti. Cada cambio se lista con su línea y columna, y los que implicaron una decisión discutible se listan aparte de los que no.

Lo que arregla sin tener que adivinar

Estos casos tienen exactamente una interpretación sensata, así que se aplican sin más comentario que la entrada en el registro de cambios.

Comas finales y dobles
Se eliminan. Legales en JavaScript y JSON5, nunca en JSON.
Cadenas con comillas simples
Se convierten a comillas dobles, reescapando el contenido para que un apóstrofo interior no rompa el resultado.
Claves sin comillas
Se entrecomillan. JavaScript admite identificadores desnudos como claves; JSON no.
Comentarios
Se eliminan, tanto en forma // como /* */.
Literales de Python
True, False y None pasan a ser true, false y null.
Comillas tipográficas
Las comillas curvas que produce el autocorrector pasan a ser comillas ASCII rectas.
Espacios en blanco inválidos
Los espacios de no separación y sus parientes se convierten en espacios normales; los caracteres de ancho cero se eliminan.
Marca de orden de bytes
Se elimina del principio del documento.
Comas y dos puntos que faltan
Se insertan allí donde la gramática deja clara la intención.
Caracteres de control crudos en cadenas
Se escapan, de modo que un salto de línea literal se convierte en \n.

Lo que marca como decisión discutible

Estos cambian el significado, y ningún valor por defecto es correcto para todo el mundo. Se aplican, se listan aparte y son configurables.

Ceros a la izquierda
Por defecto se entrecomilla el valor: 02134 pasa a ser la cadena "02134". En datos reales, los ceros a la izquierda casi siempre son un código postal, un número de cuenta o un SKU, donde quitarlos destruye el valor en silencio. Si de verdad es un número, cambia la política a «convertir en número» y pasará a ser 2134.
NaN, Infinity y undefined
Se convierten en null, que es lo que sustituyen la mayoría de codificadores. Python emite NaN e Infinity desde json.dumps por defecto; pasa allow_nan=False para detectarlo en el origen.
Palabras sueltas usadas como valores
Se entrecomillan como cadenas. {"status": pending} pasa a ser {"status": "pending"}, que suele ser lo correcto y de vez en cuando no lo es.
Corchetes sin cerrar
Se cierran al final del documento. Si el archivo estaba truncado en lugar de mal escrito, esto produce un JSON válido al que le faltan datos, así que el cambio siempre se lista.
NDJSON
Varios valores completos, uno por línea, se envuelven en un array por defecto. También puedes conservar solo el primer registro, o dejar la entrada tal cual.

Lo que no hará

No se inventará estructura. Si la entrada no se parece lo bastante a JSON, la reparación falla e indica qué errores no ha podido resolver, en lugar de producir algo que se parsea pero no significa nada.

También ejecuta un número acotado de pasadas. Cada pasada puede destapar un problema que la anterior ocultaba, pero el proceso converge en vez de entrar en bucle.

How to do this in code

Cómo hacerlo en código, y la advertencia honesta: parsear de forma laxa en el consumidor casi siempre significa que algo aguas arriba está produciendo JSON malo y va a seguir haciéndolo.

py Python, repr de dict

ast.literal_eval solo evalúa estructuras literales, así que a diferencia de eval no puede ejecutar código arbitrario.

import ast, json

# A Python dict printed with str() or print() is not JSON.
text = "{'name': 'Priya', 'active': True}"

value = ast.literal_eval(text)   # safe: literals only, no eval
clean = json.dumps(value)        # '{"name": "Priya", "active": true}'
js JavaScript, JSON5

JSON5 es un superconjunto con una especificación real, lo que lo convierte en mejor destino que un parser laxo improvisado.

import JSON5 from 'json5';

// Accepts comments, trailing commas, unquoted keys, single
// quotes, hex numbers and more.
const value = JSON5.parse(text);
const strict = JSON.stringify(value);
ts TypeScript, JSONC
import { parse } from 'jsonc-parser';

// What VS Code uses for its own settings files: comments and
// trailing commas, and nothing else.
const errors: ParseError[] = [];
const value = parse(text, errors);
sh Shell
# Strip comments and trailing commas with jq's relaxed reader
jq --args . <<< "$text"

# Or normalise a JSON5 file
npx json5 -c config.json5 > config.json

Preguntas frecuentes

¿La reparación llegará a cambiar mis datos?
Solo de las maneras listadas en las decisiones discutibles, y cada una de ellas aparece en el registro de cambios con su línea y columna. Las reparaciones seguras solo afectan a la sintaxis. Si no estás de acuerdo con una decisión, cambia el ajuste y vuelve a ejecutarla.
¿Por qué 02134 se convierte en cadena y no en el número 2134?
Porque entrecomillar no pierde información y recortar sí. En datos reales los ceros a la izquierda casi siempre son significativos, y un conversor que convirtiese en silencio un código postal en un número más pequeño estaría haciendo exactamente el tipo de daño callado que este sitio existe para evitar. La opción de recortar está a un clic.
Dice que no ha podido reparar mi documento. ¿Y ahora qué?
Pásalo por el validador. La reparación solo cubre problemas con una solución inequívoca; un documento con una estructura genuinamente irrecuperable necesita que una persona decida qué se pretendía escribir.