主要观点:JSON 虽极受欢迎但存在诸多缺陷,其设计、使用及所谓“人类可读性”特征带来诸多问题,如不同语言生态中解析行为和不兼容的多样性导致数据丢失、特殊浮点值处理混乱、文本编码和无效 Unicode 问题、字节字符串处理不便、无法流式传输、规范化导致数据丢失等,且因其流行难以修正,有多种二进制格式可替代但各有问题,而 Protobuf 因其强类型模式系统可避免这些问题。
关键信息:
- JSON 定义复杂,与 JavaScript 紧密相连且存在诸多设计缺陷,如数字编码不明确、数据丢失、特殊值处理不当等。
- 不同语言和工具对 JSON 的处理方式各异,容易导致数据错误和兼容性问题。
- 像 Go 等语言在处理 JSON 时需注意类型信息,避免数据丢失。
- 一些二进制格式如 Protobuf 可避免 JSON 的问题,但也各有特点。
重要细节: - JSON 数字编码类似编程语言的数值字面量,实际是“whatever you want”,存在精度和范围限制,导致数据丢失,如随机生成的大整数在转换为浮点数时会丢失精度。
- 特殊浮点值如
Infinity
、-Infinity
和NaN
在不同语言和工具中的处理方式不同,可能导致序列化错误或数据损坏。 - JSON 字符串使用 UTF-8 编码,但对 Unicode 字符处理存在问题,允许未配对的代理项,不同语言和工具的处理方式不一致。
- JSON 无原生字节字符串表示方式,依赖 base64 编码但会破坏人类可读性且存在多种兼容问题。
- JSON 不能流式传输,JSONL 虽可解决部分问题但限制较多。
- 数字签名等操作对 JSON 文档的规范化要求会导致数据丢失,如 RFC8785 对 64 位数值的处理。
- 常见工具对 JSON 的处理可能存在问题,如 Python 会输出非标准的 JSON,难以审计和保证数据安全。而 Protobuf 设计目的就是满足 JSON 无法满足的需求,可避免这些问题。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。