Format Atlas

对比

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/plainapplication/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 格式行为。

了解详情

参考资料与规范