本文目录导读:

MsgPack(MessagePack)相比于 JSON,其平均压缩率通常在 20% 到 30% 左右,具体取决于数据内容的结构。
以下是详细的对比和说明:
核心差异:数据大小
| 特性 | JSON | MsgPack | 说明 |
|---|---|---|---|
| 数字 | 文本字符串 (如 "123456") |
二进制原始字节 (如 0x0001E240) |
MsgPack 大胜,数字越大,JSON 的字符串越长。 |
| 字符串 | 文本 (带引号) | 二进制 (长度前缀 + 原始字节) | MsgPack 略小,它节省了文本引号 。 |
| 布尔值/空值 | true/false/null (4-5字节) |
单个字节 (0xC3/0xC2/0xC0) |
MsgPack 大胜,节省3-4字节。 |
| 数组/对象 | 和逗号 ,冒号 | 无需分隔符,仅用长度前缀 | MsgPack 小胜,对于深层嵌套的结构,省去的标点符号会累积。 |
实际压缩率估算
假设一个典型的 API 响应(包含字符串、数字、数组和布尔值的混合结构):
- JSON 大小: 100 KB
- MsgPack 大小: 通常在 70 KB ~ 80 KB 之间
节省的百分比:25% ~ 30%
极端情况对比
-
纯大数字数组 (
[12345678901234567890, ...])- JSON: 每个数字需要 20+ 个字符。
- MsgPack: 每个数字用 8 字节(64位整数)表示。
- MsgPack 可以小 60% - 80%。
-
纯短字符串数组 (
["yes", "no", "ok"])- JSON: 每个字符串需要 3-5 字节 (包括引号)。
- MsgPack: 每个字符串 2-4 字节 (长度前缀 + 字符)。
- MsgPack 小 20% - 40%。
-
纯空对象/数组 (
{"a": {}})- JSON: 8 字节 (
{"a":{}})。 - MsgPack: 4 字节 (固定映射类型)。
- MsgPack 小 50%。
- JSON: 8 字节 (
为什么不是“很小很多”?
- 主要负载是字符串: 如果数据中大部分是长文本字符串 (如文章内容、名称),MsgPack 与 JSON 的差异很小,因为字符串本身的内容(字节数)占主导地位,MsgPack 只节省了每个字符串的 定界符(2字节)和长度前缀的差异。
- 标点符号占比低: 对于大型 JSON 对象, 这些字符占整体大小的比例通常低于 5%,MsgPack 之所以能压缩,主要是因为它用1字节的类型标记代替了ASCII文本(如用
0xA4代替"str"),以及用二进制存储数字。
| 数据类型 | JSON (典型大小) | MsgPack (典型大小) | 节省比例 |
|---|---|---|---|
| 简单混合对象 | 100 B | 70 - 80 B | 20% - 30% |
| 大数字为主 | 1 KB | 2 - 0.4 KB | 60% - 80% |
| 长文本为主 | 100 KB | 95 - 98 KB | 2% - 5% |
| 极简结构 | 10 B | 5 - 7 B | 30% - 50% |
在典型的 Web API 或配置数据场景中,MsgPack 比 JSON 小约 30%,它最大的优势不在于大小(因为 gzip 压缩后两者几乎一样大),而在于解析速度(二进制格式无需扫描字符串,直接按偏移量读取)和处理大数字的精度。