Reparar JSON
Arregla comas finales, comillas simples, comentarios y literales de Python, con la lista de cada cambio.
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.