[JSON] JSON / JSONB / JSON-NL / HOCON / JSON-RPC 之间的联系与区别
0 序
这五个易混淆的 JSON 关联名词,它们都处于 JSON 生态之内,但分属不同抽象层与用途。
1 JSON / JSONB / JSON-NL / HOCON / JSON-RPC 之间的联系与区别
综合定位
- JSON —— 基础数据交换语法(文本,定义值模型)。
- JSON-NL(JSON Lines / JSONL) —— JSON 的流式逐行编码(一条记录一行)。
- JSONB —— JSON 的数据库二进制存储形态(关系库中的数据类型)。
- HOCON —— 面向人类阅读的 JSON 超集(配置文件语言)。
- JSON-RPC —— 基于 JSON 的远程过程调用协议(应用层消息规范)。
联系(共同点)
- 共享同一套值模型:五者底层都以 JSON 的六种值类型为基础(object / array / string / number / boolean / null)。
- 语法内核一致:HOCON 是 JSON 的超集(合法 JSON 必是合法 HOCON);JSONB 与 JSON 接受同一输入文本;JSON-Lines 的每一行就是一个标准 JSON 值;JSON-RPC 的请求/响应本身也是 JSON 对象。
- 可相互转化:
JSON ⇄ JSON-Lines(展开/折叠数组)、JSON ⇄ JSONB(文本解析为二进制)、JSON ⇄ HOCON(HOCON 可写为合法 JSON)、JSON-RPC 载荷亦可用 JSON-Lines 逐行传输。 - 独立于编程语言:都是跨语言的数据 / 配置 / 协议载体。
区别(本质差异)
| 维度 | JSON | JSON-NL(JSONL/NDJSON) | JSONB | HOCON | JSON-RPC |
|---|---|---|---|---|---|
| 全称 / 本质 | JavaScript Object Notation,数据交换文本语法 | Newline-Delimited JSON,逐行 JSON 文本序列 | Binary JSON,数据库二进制存储类型 | Human-Optimized Config Object Notation,配置语言 | JSON Remote Procedure Call,基于 JSON 的 RPC 协议 |
| 抽象层 | 数据语法(基础) | 数据载体 / 流编码 | 存储形态(库内类型) | 配置表达 | 应用消息协议 |
| 文本 / 二进制 | 文本 | 文本 | 二进制 | 文本 | 文本 |
| 是否 JSON 超集 | ——(基准) | 否(子集使用方式) | 否(存储层,输入是 JSON) | 是(超集) | 否(协议,载荷是 JSON) |
| 是否支持注释 | 否 | 否 | 否 | 是(# //) | 否 |
| 是否支持索引/查询 | 否 | 否 | 是(GIN 索引、表达式查询) | 否 | 否 |
| 记录分隔 | 无(单文档) | 换行符 \n | 无(库内值) | 无(单文档) | 请求/响应成对消息 |
| 典型用途 | API 载荷、配置文件、通用交换 | 日志、流式数据、ML 数据集 | 关系库中的半结构化字段查询 | 应用 / 框架配置文件 | 服务间方法调用(RPC) |
| 代表标准/来源 | ECMA-404、RFC 8259 | jsonlines.org(2013)、NDJSON 1.0、RFC 7464 | PostgreSQL 9.4(2014) | Lightbend(Typesafe Config) | JSON-RPC 2.0(jsonrpc.org) |
| 典型使用方 | 几乎所有系统 | Hadoop/Spark/Flink、LLM 数据集、日志管道 | PostgreSQL / MySQL / DWS 等数据库 | Play、EMQX 5.0、NanoMQ、Puppet | Ethereum、LSP、MCP |
| 人类可读性 | 中(可格式化) | 低(单行压缩) | 低(二进制) | 高(面向人类) | 中 |
关系示意图
flowchart TD
subgraph L1["语法层"]
JSON["JSON<br/>基础数据交换语法<br/>(ECMA-404 / RFC 8259)"]
end
subgraph L2["表达/载体层"]
NL["JSON-NL (JSONL/NDJSON)<br/>逐行流式文本序列<br/>面向日志·大数据·ML数据集"]
HOCON["HOCON<br/>人类可读配置语言<br/>(JSON 超集: 注释/包含/替换)"]
end
subgraph L3["存储层"]
JSONB["JSONB<br/>数据库二进制存储类型<br/>(PG/MySQL/DWS, 支持索引)"]
end
subgraph L4["协议层"]
RPC["JSON-RPC<br/>远程过程调用协议<br/>(Ethereum/LSP/MCP)"]
end
JSON -->|"每行一个JSON值"| NL
JSON -->|"超集,兼容全部JSON语法"| HOCON
JSON -->|"解析为二进制存储"| JSONB
JSON -->|"请求/响应载荷用JSON编码"| RPC
选型建议(何时用哪个)
- 服务间数据交换 / API 载荷 → JSON。
- 日志、流式 ETL、超大 / 增量数据集、ML 训练样本 → JSON-NL(JSONL/NDJSON)。
- 关系库中存半结构化字段、需要索引查询与更新 → JSONB(或 MySQL 的 JSON 类型)。
- 写人类友好的配置文件(带注释、变量替换、include) → HOCON。
- 在 JSON 之上定义方法调用 / 请求响应协议(如区块链、编辑器 LSP、MCP) → JSON-RPC。
Y 推荐文献
X 参考文献
本文作者:
千千寰宇
本文链接: https://www.cnblogs.com/johnnyzen
关于博文:评论和私信会在第一时间回复,或直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
日常交流:大数据与软件开发-QQ交流群: 774386015 【入群二维码】参见左下角。您的支持、鼓励是博主技术写作的重要动力!
本文链接: https://www.cnblogs.com/johnnyzen
关于博文:评论和私信会在第一时间回复,或直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
日常交流:大数据与软件开发-QQ交流群: 774386015 【入群二维码】参见左下角。您的支持、鼓励是博主技术写作的重要动力!

浙公网安备 33010602011771号