Cómo codificar JSON a Base64
- Pega el JSON en Entrada · texto, o pulsa Ejemplo para cargar un objeto de muestra.
- Copia el Base64 de Salida · Base64. Las cifras de tamaño muestran cuánto ha crecido.
- Para URL, cookies o valores tipo token, marca URL-safe (- _) y Sin relleno (=).
- Descargar guarda el resultado como
base64.txt.
El ejemplo de esta página, {"id":42,"name":"base64hub","tags":["json","encode"],"active":true}, ocupa 67 bytes y se codifica como eyJpZCI6NDIsIm5hbWUiOiJiYXNlNjRodWIiLCJ0YWdzIjpbImpzb24iLCJlbmNvZGUiXSwiYWN0aXZlIjp0cnVlfQ==. Para comprobar un resultado, pulsa Intercambiar o usa Base64 a JSON, que además lo formatea.
Los espacios y el formato cambian el Base64
Base64 codifica exactamente los caracteres del texto JSON, así que dos documentos JSON que significan lo mismo producen Base64 distinto si difieren en un solo espacio:
| Texto JSON | Base64 |
|---|---|
{"a":1} | eyJhIjoxfQ== |
{"a": 1} | eyJhIjogMX0= |
{ "a": 1 } | eyAiYSI6IDEgfQ== |
{"a":1} formateado en tres líneas | ewogICJhIjogMQp9 |
Cuando el Base64 se compara, se guarda en caché o se firma, genera el JSON con un solo serializador y con ajustes fijos, y codifica esa cadena exacta. El orden de las claves es otra trampa: la mayoría de los serializadores mantienen el orden de inserción, así que {"a":1,"b":2} y {"b":2,"a":1} se codifican de forma distinta.
Python y JavaScript no coinciden por defecto
El objeto {"name": "Zoë", "n": 1} serializado con los valores por defecto de cada lenguaje:
| Serializador | Texto JSON | Base64 |
|---|---|---|
JavaScript JSON.stringify | {"name":"Zoë","n":1} | eyJuYW1lIjoiWm/DqyIsIm4iOjF9 |
Python json.dumps | {"name": "Zo\u00eb", "n": 1} | eyJuYW1lIjogIlpvXHUwMGViIiwgIm4iOiAxfQ== |
Python con separators=(",", ":"), ensure_ascii=False | {"name":"Zoë","n":1} | eyJuYW1lIjoiWm/DqyIsIm4iOjF9 |
Con URL-safe y sin relleno marcados, la versión de JavaScript pasa a ser eyJuYW1lIjoiWm_DqyIsIm4iOjF9.
Dónde se usa JSON en Base64
- Cabeceras HTTP. Las cabeceras personalizadas que llevan contexto, como datos de trazas o metadatos del usuario, suelen contener JSON en Base64, porque las comillas del JSON y los caracteres no ASCII no son seguros en los valores de cabecera. Muchos servidores rechazan líneas de cabecera de más de unos 8 KB, así que mantén pequeñas estas cargas.
- Parámetros de URL. Los valores
statede OAuth, los destinos de redirección y los enlaces para compartir a veces llevan un pequeño objeto JSON en Base64URL. - Variables de entorno y secretos. Una configuración JSON entera cabe en una variable sin escapes, por ejemplo la clave de una cuenta de servicio en un sistema de CI.
- Formatos de token. La cabecera y el payload de un JWT son JSON codificado en Base64URL sin relleno. Para crear un token firmado, usa el codificador JWT; esta página solo codifica.
Base64 añade un tercio al tamaño, y las comillas y claves del propio JSON a menudo ocupan más que los valores. La sobrecarga de tamaño de Base64 muestra cuándo compensa comprimir antes.
JSON a Base64 en código
const obj = { name: "Zoë", n: 1 };
const bytes = new TextEncoder().encode(JSON.stringify(obj));
btoa(String.fromCharCode(...bytes)); // "eyJuYW1lIjoiWm/DqyIsIm4iOjF9"
Buffer.from(JSON.stringify(obj)).toString("base64url"); // "eyJuYW1lIjoiWm_DqyIsIm4iOjF9" (Node.js)
Sin el paso por TextEncoder, btoa(JSON.stringify(obj)) codifica ë como un único byte Latin-1 (eyJuYW1lIjoiWm/rIiwibiI6MX0=), que los decodificadores UTF-8 no pueden leer, y lanza un error con cualquier cosa fuera de Latin-1, como un emoji.
import base64, json
obj = {"name": "Zoë", "n": 1}
text = json.dumps(obj, separators=(",", ":"), ensure_ascii=False)
base64.b64encode(text.encode("utf-8")).decode() # 'eyJuYW1lIjoiWm/DqyIsIm4iOjF9'
Más opciones en las páginas de JavaScript, Node.js y Python.
Preguntas frecuentes
¿Cómo convierto JSON a Base64?
Serializa el JSON a una cadena, codifica la cadena como UTF-8 y codifica en Base64 los bytes. Pega el JSON arriba para ver el resultado, o usa btoa con un paso UTF-8 en JavaScript y base64.b64encode(json.dumps(obj).encode()) en Python.
¿Por qué el mismo objeto da un Base64 distinto en Python y en JavaScript?
Sus serializadores son diferentes. json.dumps de Python añade espacios tras : y , y escapa lo que no es ASCII como \u00eb, mientras que JSON.stringify no hace ninguna de las dos cosas. Usa separators=(",", ":") y ensure_ascii=False para que coincidan.
¿Esta herramienta valida o minifica mi JSON?
No, codifica el texto exactamente como lo escribiste, espacios incluidos. Minifica antes el JSON si la salida tiene que ser corta o idéntica byte a byte a la de otro sistema.
¿Debo usar Base64 URL-safe para JSON en una URL?
Sí. El Base64 estándar puede contener +, / y =, que tienen significado en las URL. Marca URL-safe y Sin relleno, el mismo formato que usa JWT.