Desescapar JSON
Recupera JSON legible desde una cadena escapada, tenga las capas que tenga.
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
Toma una cadena JSON escapada y recupera el texto original. Las comillas que la rodean se eliminan si están, las secuencias de escape se decodifican, y \uXXXX pasa a ser el carácter que nombra.
También cuenta cuántas capas de codificación tiene un valor, porque un payload al que se le ha aplicado JSON.stringify dos veces es un fallo de API habitual, y además ilegible.
La doble codificación, y cómo detectarla
Un valor que se ha serializado, se ha metido en un campo de texto y se ha vuelto a serializar llega hecho un revoltijo de barras invertidas. Serializado una tercera vez, se vuelve a duplicar.
Esta herramienta detecta el número de capas y te ofrece quitarlas todas. La causa habitual es un servicio que guarda un payload como texto y luego lo devuelve dentro de un sobre JSON sin decodificarlo antes, o un cliente que llama a stringify sobre algo ya stringificado.
Lo que reporta en vez de adivinar
Una secuencia de escape inválida es un aviso, no una decisión silenciosa. \x41 no es JSON válido, y una herramienta que lo convirtiese calladamente en A estaría inventando un significado que el documento no tiene. Obtienes la posición y una explicación, y la barra invertida se descarta para que el resto del texto sobreviva.
Si el resultado decodificado es a su vez JSON válido, también se indica, que es la forma más rápida de confirmar que has terminado de pelar capas.
How to do this in code
Desescapar en código.
js JavaScript
// If the value includes its quotes, parse it as a JSON string
const text = JSON.parse('"line one\\nline two"');
// Peel every layer of encoding
function fullyDecode(value) {
let out = value;
for (let i = 0; i < 8 && typeof out === 'string'; i++) {
try { out = JSON.parse(out); } catch { break; }
}
return out;
} py Python
unicode_escape es la respuesta que la gente encuentra primero y es incorrecta para cualquier cosa que no sea ASCII.
import json
text = json.loads('"line one\\nline two"')
# Standard library, without the surrounding quotes
text = bytes(raw, 'utf-8').decode('unicode_escape')
# Note: unicode_escape assumes Latin-1 for bytes above 127,
# so it mangles non-ASCII. json.loads is the correct route. sh jq
fromjson es la función incorporada de jq para exactamente el caso de la doble codificación.
# Decode a JSON string to raw text
jq -r . <<< '"line one\nline two"'
# Peel a doubly encoded field
jq -r '.payload | fromjson' response.json Preguntas frecuentes
- ¿Por qué mi salida sigue teniendo barras invertidas?
- Porque estaba codificada más de una vez. Activa «quitar todas las capas», o vuelve a ejecutar la herramienta sobre su propia salida hasta que el recuento llegue a cero.
- ¿Qué significa que el resultado sea JSON válido?
- Que la cadena contenía un documento JSON en vez de texto plano. Ese es el caso de la doble codificación, y la herramienta lo dice explícitamente.