如何把 JSON 编码为 Base64
- 把 JSON 粘贴到 输入 · 文本,或按 示例 载入一个示例对象。
- 从 输出 · Base64 复制 Base64。大小数字会显示它变长了多少。
- 用于 URL、Cookie 或类似令牌的值时,勾选 URL 安全(- _) 和 不填充(=)。
- 下载 会把结果保存为
base64.txt。
本页的示例 {"id":42,"name":"base64hub","tags":["json","encode"],"active":true} 有 67 字节,编码结果是 eyJpZCI6NDIsIm5hbWUiOiJiYXNlNjRodWIiLCJ0YWdzIjpbImpzb24iLCJlbmNvZGUiXSwiYWN0aXZlIjp0cnVlfQ==。要检查结果,按 互换,或使用 Base64 转 JSON,它还能格式化输出。
空白和格式会改变 Base64
Base64 编码的是 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 |
|---|---|---|
JavaScript JSON.stringify | {"name":"Zoë","n":1} | eyJuYW1lIjoiWm/DqyIsIm4iOjF9 |
Python json.dumps | {"name": "Zo\u00eb", "n": 1} | eyJuYW1lIjogIlpvXHUwMGViIiwgIm4iOiAxfQ== |
Python,使用 separators=(",", ":")、ensure_ascii=False | {"name":"Zoë","n":1} | eyJuYW1lIjoiWm/DqyIsIm4iOjF9 |
勾选 URL 安全和不填充后,JavaScript 版本会变成 eyJuYW1lIjoiWm_DqyIsIm4iOjF9。
Base64 JSON 的使用场景
- HTTP 请求头。 携带上下文的自定义请求头(例如链路追踪或用户元数据)经常存放 Base64 JSON,因为原始 JSON 中的引号和非 ASCII 字符放在请求头值中并不安全。很多服务器会拒绝超过约 8 KB 的请求头行,所以这类载荷要尽量小。
- URL 参数。 OAuth 的
state值、重定向目标和分享链接有时会以 Base64URL 携带一个小 JSON 对象。 - 环境变量和密钥。 整个 JSON 配置无需转义就能放进一个变量,例如 CI 系统中的服务账号密钥。
- 令牌格式。 JWT 的头部和载荷是不带填充、经 Base64URL 编码的 JSON。要生成签名的令牌,请使用 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 解码器无法读取;遇到 Emoji 等超出 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 中用带 UTF-8 转换步骤的 btoa,在 Python 中用 base64.b64encode(json.dumps(obj).encode())。
为什么同一个对象在 Python 和 JavaScript 中得到的 Base64 不一样?
它们的序列化器不同。Python 的 json.dumps 会在 : 和 , 后面加空格,并把非 ASCII 字符转义为 \u00eb,而 JSON.stringify 两者都不做。使用 separators=(",", ":") 和 ensure_ascii=False 即可一致。
这个工具会校验或压缩我的 JSON 吗?
不会,它严格按你输入的文本编码,包括空白字符。如果输出需要尽量短,或必须与另一个系统的结果逐字节一致,请先压缩 JSON。
放进 URL 的 JSON 应该用 URL 安全的 Base64 吗?
应该。标准 Base64 可能包含 +、/ 和 =,它们在 URL 中有特殊含义。请勾选 URL 安全和不填充,这与 JWT 使用的格式相同。