对比
Protocol Buffers 与 JSON
Protocol Buffers 根据 `.proto` 模式定义类型化消息,提供基于字段编号的二进制 wire 格式,以及独立的 ProtoJSON 映射。JSON 是 RFC 8259 定义的通用文本格式,不预设特定模式。
应该选择哪种格式?
RPC 或服务消息需要管理类型契约和二进制 wire 兼容性时选择 Protobuf。通用文本数据结构和广泛 JSON 工具支持则适合 JSON。
适用于 Protocol Buffers 模式文件
定义 Protocol Buffers 消息结构 · 在不同编程语言间共享数据约定
- 使用 protoc 生成各语言代码
- 定义 RPC 和服务间通信所用的消息
适用于 JSON
Web API、配置文件和数据交换
- 传递结构化数据
基本信息
| 项目 | Protocol Buffers 模式文件 | JSON |
|---|---|---|
| 扩展名 | .proto | .json |
| MIME 类型 | text/plain | application/json |
| 常见用途 | 定义 Protocol Buffers 消息结构 · 在不同编程语言间共享数据约定 | Web API、配置文件和数据交换 |
| 打开方式 | 可用文本编辑器或支持 Protocol Buffers 的 IDE 打开。要检查语法和导入项,请使用项目所用版本及配置的 protoc 进行编译。 | 可使用文本编辑器、IDE或支持JSON的查看器打开。 |
| 导出或转换 | 迁移到其他模式格式时,应先映射类型、字段编号、默认值、枚举值和兼容性语义,再生成代码并测试实际数据。仅把扩展名改成 .json 或二进制格式并不会完成转换。 | 可使用应用程序或转换工具将其转换为CSV等格式。 |
按用途选择
使用 protoc 生成各语言代码
定义 Protocol Buffers 消息结构 · 在不同编程语言间共享数据约定
Protocol Buffers 模式文件定义 RPC 和服务间通信所用的消息
定义 Protocol Buffers 消息结构 · 在不同编程语言间共享数据约定
Protocol Buffers 模式文件传递结构化数据
Web API、配置文件和数据交换
JSON关键点 1
Protobuf 二进制 wire 数据依赖 `.proto` 定义和字段编号。JSON 可表示文本对象和数组而不要求模式;ProtoJSON 则把 Protobuf 类型按独立规则映射为 JSON 值。
进一步了解差异关键点 2
ProtoJSON 将 bytes 映射为 base64 字符串、int64 映射为字符串、枚举映射为名称,并将字段名转换为 JSON 键。这些规则既不是二进制 wire 格式,也不等同任意 JSON Schema。
进一步了解差异进一步了解差异
服务间类型契约和紧凑二进制交换使用 Protobuf。通用文本接口使用 JSON。若使用 Protobuf 的 JSON 表示,应遵循 ProtoJSON,而不要假设任意 JSON 文档都等价。检查 presence、null、数值范围、未知字段和模式演进。
- 解释 Protobuf wire 消息中的字段编号和类型需要匹配模式;通用 JSON 语法不要求模式。
- ProtoJSON 有专门映射和兼容规则,效率低于二进制 wire 格式,且不能以相同方式保留未知字段。
- 转换会影响字段 presence、整数精度、枚举名、map 键、oneof、null 和未知字段。应使用实际运行库以及新旧模式版本验证。
常见问题
ProtoJSON 能与任意 JSON 文档互换吗?
不能。ProtoJSON 表示 Protobuf 模式可表达的结构并遵循专有映射,无法表示所有 JSON Schema,也不能保留全部 wire 格式行为。