BSON 二进制 JSON 完整通俗讲解
一、字面拆解
- JSON:文本格式,人类可读字符串
{"name":"张三","age":20} - BSON = Binary JSON:二进制版的 JSON,把 JSON 文本转成二进制字节存储 / 传输
二、核心设计目的
JSON 是纯文本,有明显缺陷:
- 解析慢:字符串要反复转数字、判断类型
- 体积大:引号、逗号、大括号都是冗余字符
- 类型缺失:JSON 只有
数字/字符串/布尔/数组/对象/null,没有日期、二进制、长整型、小数高精度类型
BSON 就是为了解决这些问题诞生,最典型使用场景:MongoDB 数据库底层存储、通信协议全部用 BSON。
三、BSON 和 JSON 的关键区别
1. 存储形式
- JSON:UTF-8 文本字符串
{"id":1000000,"birth":"2025-01-01","score":95.5}- BSON:二进制字节流,机器直接读,人看不懂
2. 支持更多数据类型(最大优势)
JSON 做不到的,BSON 原生支持:
- Date 日期类型:毫秒时间戳存储,不用字符串存日期
- Binary 二进制字节:图片、文件、字节数组直接存,不用 Base64 编码(大幅省空间)
- Long 64 位长整数:JSON 数字是浮点数,超大整数会丢失精度,BSON 原生支持 long
- Decimal128 高精度小数:金融金额无精度丢失
- ObjectId、正则、时间戳、无符号整数等 Mongo 专属类型
3. 结构特点
BSON 每条文档结构固定:长度(4字节) + 键值对集合 + 结束标记(1字节)每个字段都自带类型标记,程序不用猜类型,解析速度远快于 JSON。
4. 读写性能对比
- JSON:解析时要分词、去引号、字符串转数字,CPU 开销高
- BSON:二进制带类型标识,直接按字节截取,序列化 / 反序列化更快
5. 体积
单纯简单小对象:BSON 可能略大(存了类型、长度头) 包含二进制、大数字、日期场景:BSON 远小于 JSON(JSON 要 Base64 存二进制,膨胀 33%)
四、举个直观例子
JSON 文本
{ "uid": 123456, "name": "小明", "createTime": "2026-07-05", "avatar": "二进制图片Base64字符串..." }问题:日期是字符串、图片 Base64 膨胀、uid 大数可能精度丢失
等价 BSON 二进制内部逻辑
- uid:类型标记 Int64 + 键名 uid + 数字 123456(二进制存储)
- name:字符串类型 + "小明"
- createTime:Date 类型 + 毫秒时间戳(数字,不是文本)
- avatar:Binary 类型 + 原始图片字节(无需 Base64)
五、常见使用场景
- MongoDB:数据库磁盘存储、客户端与服务端通信全部使用 BSON
- 高性能 RPC / 消息中间件:追求序列化速度、需要传二进制数据
- 存储带图片、文件、高精度金额的结构化数据
六、一句话总结
BSON 是带完整类型信息的二进制 JSON 扩展格式,牺牲人类可读性,换取更快解析、更丰富数据类型、原生支持二进制文件存储,是 MongoDB 的底层标准格式。