BSON(二进制 JSON)

📅 2026/7/8 2:14:39 👁️ 阅读次数 📝 编程学习
BSON(二进制 JSON)

BSON 二进制 JSON 完整通俗讲解

一、字面拆解

  • JSON:文本格式,人类可读字符串{"name":"张三","age":20}
  • BSON = Binary JSON二进制版的 JSON,把 JSON 文本转成二进制字节存储 / 传输

二、核心设计目的

JSON 是纯文本,有明显缺陷:

  1. 解析慢:字符串要反复转数字、判断类型
  2. 体积大:引号、逗号、大括号都是冗余字符
  3. 类型缺失:JSON 只有数字/字符串/布尔/数组/对象/null,没有日期、二进制、长整型、小数高精度类型

BSON 就是为了解决这些问题诞生,最典型使用场景:MongoDB 数据库底层存储、通信协议全部用 BSON。

三、BSON 和 JSON 的关键区别

1. 存储形式

  • JSON:UTF-8 文本字符串
{"id":1000000,"birth":"2025-01-01","score":95.5}
  • BSON:二进制字节流,机器直接读,人看不懂

2. 支持更多数据类型(最大优势)

JSON 做不到的,BSON 原生支持:

  1. Date 日期类型:毫秒时间戳存储,不用字符串存日期
  2. Binary 二进制字节:图片、文件、字节数组直接存,不用 Base64 编码(大幅省空间)
  3. Long 64 位长整数:JSON 数字是浮点数,超大整数会丢失精度,BSON 原生支持 long
  4. Decimal128 高精度小数:金融金额无精度丢失
  5. 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 二进制内部逻辑

  1. uid:类型标记 Int64 + 键名 uid + 数字 123456(二进制存储)
  2. name:字符串类型 + "小明"
  3. createTime:Date 类型 + 毫秒时间戳(数字,不是文本)
  4. avatar:Binary 类型 + 原始图片字节(无需 Base64)

五、常见使用场景

  1. MongoDB:数据库磁盘存储、客户端与服务端通信全部使用 BSON
  2. 高性能 RPC / 消息中间件:追求序列化速度、需要传二进制数据
  3. 存储带图片、文件、高精度金额的结构化数据

六、一句话总结

BSON 是带完整类型信息的二进制 JSON 扩展格式,牺牲人类可读性,换取更快解析、更丰富数据类型、原生支持二进制文件存储,是 MongoDB 的底层标准格式。