和服务器交互除了 JSON,还有 XML、YAML、Protobuf、MessagePack、Avro 等格式,甚至纯文本和二进制流在某些场景下仍是主流选择。JSON 只是因为“人机皆宜”成了默认项,但高性能、高密度、强类型场景下,它并不是最优解。
json和xml对比:为什么老项目还在用 XML
XML 比 JSON 年长将近 15 年,它标签冗长、解析偏慢,但胜在 自定义标签语义 和 命名空间机制,在金融报文、电子发票、OFD 版式文件、SOAP 协议等企业级系统里仍是“硬通货”。
XML 的核心优势不是传输效率,而是契约能力。
- XML Schema(XSD)可以严格校验数据结构,字段缺了、类型错了直接拒收。
- XSLT 能够把数据渲染成 HTML、PDF 等多种视图,一个数据源多种展示形态。
- 数字签名与加密标准(XML Signature、XML Encryption)比 JSON 对应方案成熟得早,银行间接口至今仍以 XML 为底。
什么时候该用 XML:
- 对接老系统:银行、税务、海关、医院挂号平台,接口文档里写着“请求报文为 XML”。
- 需要严格数据合约的场景:电子合同、司法存证、政务数据交换平台。
- 数据需要被 XSLT 直接转换渲染的场景。
2000 年到 2015 年之间的核心交易系统,几乎都是用 XML 垒起来的,行业共识认为,XML 消减的最大成本是“扯皮成本”字段定义明确到每个层级,谁错了谁负责,如果你接手的项目的接口文档还写着 SOAP,别急着吐槽,那是很多机构十几年没动过的承重墙。
客户端和服务器交互方式有哪些:从文本到二进制
JSON 是文本格式的“扛把子”,但文本格式天生占空间,遇到移动端弱网、物联网低频窄带、服务间百万级 QPS 调用,响应体每多 100 个字符都会变成真金白银的耗时和流量。
YAML:人类可读性比 JSON 更好的配置格式
YAML 严格来说不是“传输格式”,而是“配置格式”,但如果你要在服务器和客户端之间同步一份 带注释、带层级、可读性极高的配置,YAML 比 JSON 舒服得多。
server:
host: api.example.com
port: 443
features:
- auth
- audit
- rate_limit
不少 CI/CD 流水线、Kubernetes 编排文件、OpenAPI 规范文档都在用 YAML 描述结构,它的一个隐藏价值是 自带注释,JSON 没法写注释,YAML 可以,团队内部的接口 mock 文件、环境变量模板、部署清单,用 YAML 维护效率比 JSON 高不少。
Protobuf:性能敏感项目的共同选择
Protobuf 是 Google 推出的二进制序列化协议,

体积约为 JSON 的 1/5 到 1/10,解析速度是 JSON 的数倍,这背后是因为它用 .proto 文件先定义数据结构,然后生成各语言的序列化代码,传输时按照固定字节偏移读字段,省掉了 JSON 解析时逐字符扫描字段名的开销。
Protobuf 的典型用法:
- gRPC 服务调用(这是最普遍的搭配)
- 移动端与后端的长连接推送通道
- 游戏客户端与服务器的高频状态同步
- 物联网网关上报遥测数据
使用路径直接写在这里:
- 定义
user.proto文件,写下message User { int32 id = 1; string name = 2; }。 - 用
protoc编译器生成对应语言的代码。 - 服务端和客户端都引入编译产物。
- 网络传输时直接发送二进制内容。
它不适合的场景也很明确:前端浏览器里直接消费 Protobuf 仍然麻烦,总要借助 protobufjs 之类的库来转换,调试时看不见明文。.proto 文件一旦发布,字段号不能随便修改,管理成本比 JSON 高。
MessagePack:把 JSON 压成二进制
MessagePack 是个“折中派”,它保留了 JSON 的 键值对模型,但底层用二进制表示,体积比 JSON 小不少,解析性能也比 JSON 好,它的优势是:和 JSON 数据结构几乎 1:1 对应,但不引入 .proto 文件,不需要预编译,在 Redis 缓存会话数据、轻量级 RPC、游戏排行榜等场景有大量实践。
Avro:大数据管道里的大动脉
Avro 主要在 Hadoop、Kafka 生态里活跃,它的特点是 schema 跟随数据一起传输,读数据的进程没有本地 schema 也能还原完整结构,非常适合离线批处理和数据湖场景,做实时数仓的朋友,每天打交道的 Kafka 消息体,很大概率就是 Avro 编码的。
protobuf适合什么场景?如何快速判断
这个问题没有标准答案,但可以从几个硬指标下手。
满足以下全部条件时,优先用 Protobuf:
- 接口调用频率高(上万 QPS),并且对延迟敏感。
- 带宽成本高(弱网、海外链路、移动流量包)。
- 服务端语言与技术栈由自己掌控。
- 有完善的 CI 流程,能保证 .proto 文件变更后各个端同步发布。
满足以下任一条时,继续用 JSON 反而明智:
- 接口的调用方包括前端浏览器页面。
- 接口是开放平台对第三方开发者提供,外部开发者调试体验很重要。
- 团队没有单独维护 .proto 文件的人力预算。
- 接口变动频繁,一周改三次字段,用 Protobuf 会让你疲于应付版本兼容。

实际操作中,很多团队做了一个混合方案:网关层对前端暴露 JSON,内部微服务间走 gRPC + Protobuf,这个模式用了很多年,业界验证充分,值得借鉴。
接口返回格式为什么不能一刀切:选型对照表
| 格式 | 可读性 | 体积 | 解析性能 | 强类型 | 典型场景 |
|---|---|---|---|---|---|
| JSON | 高 | 中 | 中 | 弱 | Web API、开放平台、移动端接口 |
| XML | 中 | 高 | 慢 | 中 | 金融政务、SOAP 老系统、电子发票 |
| YAML | 很高 | 高 | 慢 | 弱 | 配置文件、CI 流程、接口描述文档 |
| Protobuf | 低 | 很小 | 极快 | 强 | gRPC、微服务、游戏同步 |
| MessagePack | 低 | 小 | 快 | 弱 | 会话存储、轻量 RPC |
| Avro | 低 | 小 | 快 | 强 | Kafka、Hadoop 生态、实时数仓 |
有一个思路比格式本身更重要:看最终消费数据的是人还是机器,机器消费,优先考虑体积和解析效率;人要看明文的,优先考虑可读性,两者都想要,就在网关层做转换,这本身也是网关的职责之一。
长期以来关于“接口返回格式选 JSON 还是二进制”的争论,本质上混淆了两个问题:传输成本问题 和 调试便利性问题,前者靠压缩算法和 HTTP/2 头部压缩可以缓解一部分,后者靠网关中转也能解决,真要到了切换协议的那一步,肯定是为了解决某个瓶颈,而不是跟风。
如何识别服务器实际返回了什么格式
服务器在 HTTP 响应头里已经告诉了你。
| Content-Type | 对应格式 |
|---|---|
| application/json | JSON |
| application/xml / text/xml | XML |
| application/x-yaml / text/yaml | YAML |
| application/protobuf / application/octet-stream | Protobuf 或二进制 |
| application/x-msgpack | MessagePack |
| application/avro | Avro |
用 curl 抓一下便知:
curl -i https://api.example.com/user/1001
返回信息里找到 Content-Type

那一行,基本就能确定对方用什么格式在和你对话。
如果服务器返回的是一堆无法用文本阅读的乱码,大概率是二进制序列化格式,此时需要拿到对应的 schema 或 .proto 文件才能解码。没有 schema 的二进制接口,等同于没有说明书的机器,调试成本极高,这也是许多团队在内部 API 上坚持用 JSON 的原因。
和服务器交互的隐藏格式:纯文本和表单
服务器交互不止“接口返回”这一种,静态资源服务器把 HTML、CSS、JS 直接甩给浏览器,这种也算,HTML 本质就是一种结构化超文本格式,只是它重在“呈现”而非“传输”,表单提交的时候,application/x-www-form-urlencoded 编码的键值对,也是服务器交互的常规姿势。
还有基于换行符分隔的 NDJSON,适合日志流式导出场景,每行一个 JSON 对象,方便逐行读取,以及 SSE(Server-Sent Events),服务器用纯文本流持续向客户端推送事件,聊天室通知、行情刷新都在用,这些格式虽然不花哨,但它们在特定场景下的优势是 JSON 替代不了的。
常见问题解答
接口返回格式json和protobuf区别在哪里?
JSON 是文本格式,字段名显式出现在数据里,人眼可读,调试方便,扩展不需要预编译,Protobuf 是二进制格式,传输前需要定义 .proto 文件并生成代码,字节体积更小、编解码性能更高,但肉眼不可读,调试需要额外工具辅助,选择哪一边取决于调用方的技术背景、流量规模和团队维护能力。
小程序后端接口用什么格式好?
绝大多数情况下用 JSON 就好,微信开发者工具可以直接查看网络返回,如果小程序内有大量实时交互(比如在线协作、语音互动、游戏对局),可以考虑把低频接口保留 JSON,把高频状态同步通道换成 WebSocket + Protobuf,能明显降低延迟和流量消耗。
服务器返回了二进制乱码,怎么知道是什么格式?
先用 file 命令判断文件类型(在服务端或本地均可尝试),再用 hexdump 查看前几十个字节的魔数,如果开头含有 < 或 <?xml,是 XML,如果开头是 或 [,是 JSON,如果完全不可读但数据紧凑,优先怀疑 Protobuf 或 MessagePack,拿到接口提供方的 .proto 定义或编码文档,才能彻底解包数据。
多一种格式知识,就多一条排障的退路。 把 JSON 当唯一解的人,大概率还没遇到过几百万日活、几十毫秒延迟预算的硬需求,真正的选型逻辑很简单:在正确的位置用正确的工具,别让习惯替你拍板。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/812714.html

