Как закодировать JSON в Base64
- Вставьте JSON в поле Ввод · текст или нажмите Пример, чтобы загрузить образец объекта.
- Скопируйте Base64 из поля Результат · Base64. Цифры размера показывают, насколько он стал длиннее.
- Для URL, cookie и значений вроде токенов отметьте URL-safe (- _) и Без дополнения (=).
- Скачать сохраняет результат в файл
base64.txt.
Пример на этой странице, {"id":42,"name":"base64hub","tags":["json","encode"],"active":true}, занимает 67 байт и кодируется в eyJpZCI6NDIsIm5hbWUiOiJiYXNlNjRodWIiLCJ0YWdzIjpbImpzb24iLCJlbmNvZGUiXSwiYWN0aXZlIjp0cnVlfQ==. Чтобы проверить результат, нажмите Поменять местами или воспользуйтесь Base64 в JSON, который заодно отформатирует JSON.
Пробелы и форматирование меняют Base64
Base64 кодирует текст JSON как есть и ничего не знает о структуре данных. Два JSON-документа с одинаковым смыслом дают разный Base64, если отличается хотя бы один пробел:
| Текст JSON | Base64 |
|---|---|
{"a":1} | eyJhIjoxfQ== |
{"a": 1} | eyJhIjogMX0= |
{ "a": 1 } | eyAiYSI6IDEgfQ== |
{"a":1}, отформатированный в три строки | ewogICJhIjogMQp9 |
Это важно, когда Base64 сравнивают, кешируют или подписывают. Получайте JSON одним сериализатором с фиксированными настройками и кодируйте именно эту строку. Ещё одна ловушка связана с порядком ключей: большинство сериализаторов сохраняют порядок вставки, поэтому {"a":1,"b":2} и {"b":2,"a":1} кодируются по-разному.
Python и JavaScript по умолчанию расходятся
Объект {"name": "Zoë", "n": 1}, сериализованный с настройками по умолчанию в каждом языке:
| Сериализатор | Текст JSON | Base64 |
|---|---|---|
JSON.stringify в JavaScript | {"name":"Zoë","n":1} | eyJuYW1lIjoiWm/DqyIsIm4iOjF9 |
json.dumps в Python | {"name": "Zoë", "n": 1} | eyJuYW1lIjogIlpvXHUwMGViIiwgIm4iOiAxfQ== |
Python с separators=(",", ":"), ensure_ascii=False | {"name":"Zoë","n":1} | eyJuYW1lIjoiWm/DqyIsIm4iOjF9 |
С включёнными URL-safe и «Без дополнения» вариант JavaScript превращается в eyJuYW1lIjoiWm_DqyIsIm4iOjF9.
Где используется JSON в Base64
- HTTP-заголовки. Собственные заголовки с контекстом, например для трассировки или метаданных пользователя, часто содержат JSON в Base64, потому что кавычки и не-ASCII символы из «сырого» JSON небезопасны в значениях заголовков. Многие серверы отвергают строки заголовков длиннее примерно 8 КБ, так что держите такие данные компактными.
- Параметры URL. Значения OAuth
state, адреса для редиректа и ссылки для шеринга иногда несут небольшой JSON-объект в Base64URL. - Переменные окружения и секреты. Целый JSON-конфиг помещается в одну переменную без экранирования; так хранят, например, ключ сервисного аккаунта в CI-системе.
- Форматы токенов. В JWT заголовок и полезная нагрузка закодированы как JSON в Base64URL без дополнения. Чтобы собрать подписанный токен, используйте кодировщик JWT; эта страница только кодирует.
Base64 добавляет треть к размеру, а собственные кавычки и ключи JSON часто занимают больше места, чем значения. Когда выгодно сначала сжать, показывает статья о накладных расходах Base64.
JSON в Base64 в коде
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)
Без шага с TextEncoder вызов btoa(JSON.stringify(obj)) закодирует ë одним байтом Latin-1 (eyJuYW1lIjoiWm/rIiwibiI6MX0=), который не прочитают декодеры UTF-8, а на всём, что выходит за пределы Latin-1, например на эмодзи, выбросит исключение.
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'
Больше вариантов на страницах про JavaScript, Node.js и Python.
Вопросы и ответы
Как перевести JSON в Base64?
Сериализуйте JSON в строку, закодируйте строку в UTF-8 и закодируйте байты в Base64. Вставьте JSON выше, чтобы получить результат, или используйте в JavaScript btoa с шагом через UTF-8, а в Python base64.b64encode(json.dumps(obj).encode()).
Почему один и тот же объект даёт разный Base64 в Python и JavaScript?
У них разные сериализаторы. json.dumps в Python ставит пробелы после : и , и экранирует не-ASCII как \u00eb, а JSON.stringify не делает ни того, ни другого. Чтобы результаты совпали, используйте separators=(",", ":") и ensure_ascii=False.
Проверяет ли этот инструмент или минифицирует мой JSON?
Нет, он кодирует текст ровно так, как вы его набрали, вместе с пробелами. Если результат должен быть коротким или побайтно совпадать с результатом другой системы, сначала минифицируйте JSON.
Нужен ли URL-safe Base64 для JSON в URL?
Да. Стандартный Base64 может содержать +, / и =, у которых в URL есть особый смысл. Отметьте URL-safe и «Без дополнения»: тот же формат использует JWT.