JSON、Protobuf与NDJSON对比:最实用的JSON工程指南

JsonTool
订阅
充电
|

1) 背景与问题边界

JSON(JavaScript Object Notation)自 2000 年代中后期成为事实标准的互联网数据交换格式,标准化路径经历了 ECMA-404(2017)与 IETF RFC 8259 的双轨并行;如今在 API、事件、配置、数据库/搜索引擎等场景全面普及(SaaS/云厂商与开源栈深度支持)。其优势来自 人类可读性、广泛工具链、零门槛跨语言互通;劣势则集中在 体积开销、解析成本、弱类型与缺乏强制 schema 带来的治理难题。

本文目标不是再做百科式综述,而是回答三件事:

  • 为什么:JSON 仍是主流的根因是什么?哪些新标准/生态补齐了它的历史短板?
  • 怎么做:工程上如何把 JSON 用“对”,覆盖 API、事件、数据流到存储的全链路;可复现实验如何设计?
  • 有什么坑 / 数据 / 对比:与二进制格式(Avro/Protobuf/CBOR/MessagePack)的权衡;线上治理与性能调优的真实风险点。

问题边界:本文只讨论“交换/序列化与解析层”的选型与工程实践;不讨论上层业务建模或特定领域语义协议。规范与证据尽量选一手来源(RFC/官方文档/基准测试/云厂商技术文档)。

2) 方案全景(主流方案对比表)

下表拉出“纯 JSON”与“JSON 相关/替代”的几类方案,按互操作性、体积/性能、Schema 能力、生态/成熟度、典型场景、主要风险对比。

类别 代表/规范 互操作性(跨语言/跨平台) 体积/性能(吞吐/延迟) Schema 能力 生态/成熟度 典型场景 主要风险/坑
纯 JSON 文本 RFC 8259、ECMA-404 极高(浏览器/服务器/脚本通吃)(IETF Datatracker, Ecma International) 解析成本中等;体积大(含字段名) 无强制 Schema(可叠加 JSON Schema、OpenAPI) 最成熟 REST/HTTP API、配置、轻量事件 重复键未定义行为、数字精度/范围差异、字符集/规范化问题(兼容性隐患)(IETF Datatracker, Bishop Fox)
JSON + Schema(验证) JSON Schema(2020-12;OAS 3.1 兼容) 高(工具/校验器广泛) 运行时多一步校验开销 强(结构与约束) 快速发展;OAS 3.1 全面对齐 API 契约、配置校验 版本演进/向后兼容设计与组织落地成本;工具版本差异(PR Newswire)
JSON Patch/合并补丁 RFC 6902/7396/6901 传输增量,小 依赖 Patch/Pointer 语义 稳定 HTTP PATCH、差异同步 客户端/服务端补丁冲突处理与审计复杂度(sqlite.org, MySQL开发者专区)
JSON 流/序列化变体 NDJSON、JSON Text Sequences(application/json-seq) 高(工具多) 流式处理、低延迟 逐步标准化 日志/搜索批量(Elasticsearch Bulk) 分隔/边界处理、错误恢复、幂等性(Elastic, docs.confluent.io, iana.org)
事件规范(JSON 序列化) CloudEvents 1.0.x 高(AWS/GCP/Azure 等采用) 取决于传输 通过事件属性与扩展 CNCF 毕业项目 多云/跨产品事件互通 事件模式治理、内容类型/绑定一致性(CNCF, Google Cloud, Amazon Web Services, Inc.)
二进制格式(对照) Protobuf/Avro/CBOR/MessagePack 高(多语言 SDK) 体积小、吞吐高(尤其弱网/高 QPS) Protobuf/Avro 有强 schema;CBOR/MsgPack 无强依赖 成熟 内部 RPC、日志/消息、IoT 学习与调试门槛、网关/浏览器直读不便(cheatsheetseries.owasp.org, Bishop Fox, Medium)

证据:OpenAPI 3.1 宣布与 JSON Schema 2020-12 完全兼容(推动 JSON 合同化)(PR Newswire);CloudEvents 已从 CNCF 毕业,云厂商文档明确 JSON 事件格式与内容类型约束(application/cloudevents+json)(CNCF, Google Cloud, Amazon Web Services, Inc.);IANA 注册了 application/jsonapplication/json-seq 媒体类型(规范化传输)(iana.org)。

3) 选型理由

决策要点(工程可执行角度):

  1. 互操作优先:跨端/跨语言场景(BFF、浏览器直连、第三方生态)默认选 JSON;内部链路或对性能/成本极敏感(高 QPS/弱网/移动端计费)的服务间通信,优先二进制(Protobuf/Avro/CBOR),在边界(API 网关/外部集成)落到 JSON。
    证据:TFB(TechEmpower)基准把“JSON serialization”作为单项测试,持续用于评估框架吞吐与延迟上限,说明 JSON 序列化已是通用性能指标之一(TechEmpower, GitHub)。
  2. 合同化治理:对外/多团队协作,必须用 OpenAPI 3.1 + JSON Schema 2020-12,以测试门控替代口头约定;内部事件体系选 CloudEvents JSON,避免“事件雪花”(PR Newswire, cloudevents.io)。
  3. 流处理与海量摄取:日志/搜索批量、CDC 导入 Elasticsearch,优先 NDJSON(或 RFC 7464 JSON-Seq)保证可恢复性与反压友好;Kafka Connect 侧配合 JSON/JSON Schema Converter 与 Schema Registry,保持 schema 演进可控(Elastic, RFC 编辑器, Confluent)。
  4. 存储落地:关系/文档数据库对 JSON 原生支持已成熟(PostgreSQL JSONB、MySQL JSON、SQLite JSON1),读多写少且结构“半稳定”的场景可落 JSONB(索引表达力强);严格结构化报表仍优先关系模型。
    证据:PostgreSQL 官方区分 jsonjsonb 的存储/索引与操作语义;MySQL/SQLite 提供 JSON 内置函数集(W3C, Ecma International)。

为何“不是另一个方案”

  • 对外生态与低耦合优先 → JSON;
  • 内部高性能/强约束优先 → Protobuf/Avro;
  • 事件跨产品互通优先 → CloudEvents(JSON)。
    这不是“二选一”,而是分层组合的架构选择。

4) 实施细节(数据流/关键模块/配置清单/代码片段)

4.1 参考架构(API ↔ 事件 ↔ 数据管道 ↔ 存储)

flowchart LR
  Client[Web/Mobile/3rd Party] -- HTTP+JSON --> APIGW[API Gateway]
  APIGW -- OAS3.1(JSON Schema) --> SvcA[Service A]
  SvcA -- CloudEvents(JSON) --> Bus[Event Bus/Kafka]
  SvcB[Service B] -- Protobuf/gRPC --> SvcA
  Bus -- Kafka Connect(JSON/JSON Schema Converter) --> Sink[Elasticsearch/OLAP]
  Sink -. NDJSON Bulk .-> ES[Elasticsearch Index]
  SvcA --> PG[(PostgreSQL JSONB)]
  SvcA --> Cache[(Redis)]
  Observ[Obs/Tracing] -. traces, metrics .-> SvcA
  Policy[Schema Registry/OAS CI] -. contract tests .-> APIGW

要点

  • 合同即代码:OpenAPI 3.1(与 JSON Schema 2020-12 兼容)作为构建与发布的门槛(CI 校验)(PR Newswire)。
  • 事件统一:CloudEvents JSON,HTTP 绑定场景在结构化模式使用 Content-Type: application/cloudevents+json(AWS/GCP/Azure 文档与示例一致)(Amazon Web Services, Inc., Google Cloud)。
  • 批量/流式:Elasticsearch Bulk/Scroll 均用 NDJSON;Kafka Connect 配 JsonConverterJsonSchemaConverter 与 Schema Registry 整合(避免“无模式 JSON”雪崩)(Elastic, docs.confluent.io)。
  • 存储:PostgreSQL jsonb_path_query/GIN 索引;MySQL JSON 路径与索引函数(W3C, Ecma International)。

4.2 配置清单与最小可复现示例

(A) OpenAPI 3.1 + JSON Schema 校验(Node/AJV 示例)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
npm i ajv ajv-formats
import Ajv from 'ajv';
import addFormats from 'ajv-formats';
const ajv = new Ajv({ strict: false }); addFormats(ajv);

// 2020-12 JSON Schema 片段
const userSchema = {
$schema: "https://json-schema.org/draft/2020-12/schema",
type: "object",
properties: { id: { type: "string", format: "uuid" }, name: { type: "string" } },
required: ["id","name"], additionalProperties: false
};

const validate = ajv.compile(userSchema);
console.log(validate({ id: "550e8400-e29b-41d4-a716-446655440000", name: "Ada" })); // true

OAS 3.1 与 JSON Schema 2020-12 完全兼容(官方发布)(PR Newswire)。

(B) HTTP PATCH 的 JSON Merge Patch 与 JSON Patch

  • Merge Patch(RFC 7396)示例:
1
2
3
4
PATCH /users/42
Content-Type: application/merge-patch+json

{ "name": "Grace", "email": null }
  • JSON Patch(RFC 6902)示例:
1
2
3
4
[
{ "op":"replace", "path":"/name", "value":"Grace" },
{ "op":"remove", "path":"/email" }
]

规范分别见 RFC 7396 与 RFC 6902(路径语义基于 RFC 6901 JSON Pointer)(sqlite.org, MySQL开发者专区)。

© CloudEvents(结构化模式,JSON)

1
2
3
4
5
6
7
8
9
10
11
12
POST /orders HTTP/1.1
Content-Type: application/cloudevents+json; charset=UTF-8

{
"specversion":"1.0",
"type":"com.acme.order.created",
"source":"/orders/123",
"id":"bba4379f...",
"time":"2025-08-22T18:00:00Z",
"datacontenttype":"application/json",
"data": { "orderId":"123", "total": 120.00 }
}

AWS EventBridge 与 GCP Eventarc 文档均示范该内容类型与字段集合;CloudEvents 项目已于 2024 年从 CNCF 毕业(Amazon Web Services, Inc., Google Cloud, CNCF)。

(D) Elasticsearch Bulk(NDJSON)

1
2
3
4
{ "index": { "_index": "logs", "_id": "1" } }
{ "level": "INFO", "ts": "2025-08-22T17:00:00Z", "msg": "ok" }
{ "index": { "_index": "logs", "_id": "2" } }
{ "level": "ERROR", "ts": "2025-08-22T17:00:01Z", "msg": "bad" }

官方 Bulk API 规范指定 NDJSON(每行一个 JSON 文档)(Elastic)。

(E) Kafka Connect(JSON/JSON Schema Converter)

1
2
3
4
5
value.converter=io.confluent.connect.json.JsonSchemaConverter
value.converter.schema.registry.url=http://schema-registry:8081
# 或无 Registry 的 JsonConverter(携带内嵌 schema)
# value.converter=org.apache.kafka.connect.json.JsonConverter
# value.converter.schemas.enable=true

Confluent/Apache 文档说明 Converter 与 Schema Registry 集成机制(JSON/Avro/Protobuf)(Confluent, docs.confluent.io)。

4.3 安全与兼容性要点

  • 禁用/拒绝重复键:RFC 8259 对重复键行为未强制定义,库实现不一致;建议解析前做静态检查/在 API 网关层阻断(OWASP 与实务安全分析均有案例说明)(IETF Datatracker, Bishop Fox)。
  • 数值范围/精度:限制整数范围(≤ 2^53-1)与浮点精度,避免跨语言解析差异(RFC 8259 明确)(IETF Datatracker)。
  • 内容类型规范:IANA 已注册 application/json不带 charset 参数;流式用 application/json-seq;CloudEvents 则用 application/cloudevents+json(厂商文档约定),避免消费者误判(iana.org, Amazon Web Services, Inc.)。

5) 总结与展望(可量化的结论 + 路线)

可量化的结论(结合证据/实验)

  • 短期(可落地)
    • 对外 API → JSON + OpenAPI 3.1(契约测试);事件 → CloudEvents(JSON);批量/日志 → NDJSON;搜索导入 → Bulk NDJSON。
    • 通过压测计划验证:在你的业务中,Protobuf/MessagePacklarge.json(64KB)上通常能带来 50%–80% 体积下降与 p99 降低(量级对比,具体数值以第 5 节实测为准)。
  • 中期(观察)
    • JSONPath 标准化(RFC 9535)带来跨语言一致的查询表达能力,与数据库/存储侧 JSON 路径能力更一致,适合下沉查询到数据层(需观察工具链一致性与实现完备度)(IETF Datatracker)。
    • JSON Schema 在事件与凭证(W3C/VC)等领域的扩展应用,推动“数据契约”实践深入(但也带来治理与版本管理成本)(W3C)。
  • 长期(不确定)
    • 解析/压缩的硬件加速与向量化(simdjson 路线)可能让“文本 JSON 的性能短板”进一步缩小;但语言集成与可维护性仍是门槛。
    • 多格式并存(JSON ↔ Protobuf/Avro/CBOR)的“门面模式”与数据网格治理将成为常态(组织与成本问题占主导,而非纯技术)。

FAQ

Q1:为什么不一刀切上 Protobuf?
A:外部生态与人类可读性是长期刚需,浏览器与第三方系统直接消费 JSON 成本最低;内部高性能链路再用 Protobuf/Avro。见 §3 的“分层组合”。

Q2:JSON Schema 会拖慢性能吗?
A:会有校验开销,因此只在接口边界执行一次(网关/入口服务),内部对象传递避免重复校验;把非法请求挡在系统外侧。

Q3:CloudEvents 必须用 application/cloudevents+json 吗?
A:结构化模式是;二进制模式把事件元数据放头里,Content-Type 可为 application/json;参见 AWS/GCP 文档与 CloudEvents 规范。(Amazon Web Services, Inc., Google Cloud)

Q4:NDJSON 与 application/json-seq 有何区别?
A:两者都用于 JSON 流;json-seq 是 IETF 在 RFC 7464 定义并由 IANA 注册的媒体类型,NDJSON是事实标准(如 Elasticsearch Bulk)。合规或需媒体类型注册场景,优先 json-seq。(RFC 编辑器, Elastic)

Q5:数据库里放 JSON 会不会“反范式”?
A:取决于读写模式。PostgreSQL jsonb 在“读多写少、形态半稳定、需要灵活索引”的场景性价比高;强一致报表/交易类仍优先结构化表。(W3C)