5月28日 00:28

JSON、XML、YAML、CSV 各有什么优缺点?

JSON、XML、YAML、CSV 各有什么优缺点?

JSON 的核心优势

JSON 是当前 Web 开发中使用最广泛的数据交换格式,2026 年约 87% 的 Web API 响应使用 JSON。

轻量紧凑:同样的数据,JSON 的体积比 XML 小 20%-40%。一段表示用户信息的 JSON 可能只需 167 字符,而等价的 XML 需要 230 字符。这对移动端和带宽敏感场景影响显著。

解析速度快:JSON 的语法规则简单,解析器实现轻量,几乎所有编程语言都内置支持。JavaScript 可直接用 JSON.parse() / JSON.stringify() 处理,Python 用 json 模块,Go 用 encoding/json,无需额外依赖。

与语言天然映射:JSON 的对象和数组结构直接对应 JavaScript 对象、Python 字典、Java 的 Map/List,不需要额外的映射层。

无歧义语法:JSON 的语法严格,不存在像 YAML 缩进那样可能引发歧义的情况,解析结果确定性强。

JSON 的不足

不支持注释:这是 JSON 作为配置文件最大的短板。不能在文件中添加说明,团队协作时只能依赖外部文档。

数据类型有限:只支持字符串、数字、布尔、null、对象、数组六种类型。没有日期时间类型(只能用字符串约定),没有二进制数据的原生表示,大数字可能丢失精度。

不支持多行字符串:长文本需要转义换行符,可读性差。

Schema 验证相对薄弱:虽然存在 JSON Schema,但相比 XML Schema(XSD)成熟度仍有差距,工具链也不如 XSD 丰富。


XML 的核心优势

强大的元数据能力:XML 支持属性、命名空间、处理指令等,能表达比 JSON 更丰富的语义信息。例如一个 SVG 图形文件,属性和命名空间是不可或缺的。

成熟的验证体系:XSD(XML Schema Definition)提供严格的类型验证,支持复杂约束规则。在金融、保险等强监管行业,这种验证能力是刚需。

XSLT 转换:XML 拥有 XSLT 这种声明式转换语言,可以在不写代码的情况下完成复杂的数据转换,JSON 生态中没有对等工具。

文档标记能力:XML 天然适合表示带格式的文档结构,Microsoft Office(.docx、.xlsx)、SVG、RSS/Atom 都是 XML 格式。

XML 的不足

冗长:每个元素都需要开闭标签,同样的数据 XML 通常比 JSON 大 30%-40%,传输和存储成本更高。

解析复杂:XML 解析器需要处理命名空间、实体引用、CDATA 等特性,实现复杂度高,性能开销比 JSON 大。

人可读性较差:大量标签和嵌套使得 XML 文件在人工阅读和编辑时体验不佳。


YAML 的核心优势

人类友好的语法:YAML 用缩进表示层级,省略引号和括号,视觉上更干净。编写 Kubernetes 配置、Docker Compose 文件时,YAML 的可读性优势明显。

支持注释:用 # 添加注释,配置文件中可以直接标注说明,这是 JSON 做不到的。

更丰富的数据类型:原生支持日期时间、二进制、多行字符串、锚点(anchor)和别名(alias),可以减少重复定义。

JSON 的超集:合法的 JSON 也是合法的 YAML(YAML 1.2 规范),迁移成本低。

YAML 的不足

解析陷阱多:YAML 的自动类型推断经常带来意外。例如 yes / no 会被解析为布尔值,2025-01-01 会被解析为日期,这可能导致配置错误。

解析速度慢:YAML 的语法规则复杂,解析性能明显低于 JSON,大文件场景下差距更显著。

安全风险:某些 YAML 实现支持任意代码执行(如 Python 的 yaml.load()),必须显式使用 yaml.safe_load() 防范攻击。

缩进敏感:一个空格的差异可能导致解析失败或产生不同结果,在复制粘贴和格式化工具处理时容易出错。


CSV 的核心优势

极致紧凑:纯文本、逗号分隔,没有任何结构标记的冗余,数据密度最高。

工具生态丰富:Excel、Google Sheets 以及所有数据分析工具(Pandas、R)都直接支持 CSV。

流式处理友好:可以逐行读取处理,不需要将整个文件加载到内存,适合处理 GB 级数据。

跨平台通用:纯文本格式,任何编辑器都能打开,任何系统都能处理。

CSV 的不足

只支持二维表格:无法表达嵌套结构、对象数组等复杂数据。一个包含嵌套地址字段的用户数据,CSV 无法自然表示。

无类型信息:所有值都是字符串,数字、日期、布尔值的区分全靠消费端自行判断。

编码和分隔符问题:不同地区使用不同分隔符(逗号 vs 分号),编码问题(BOM 头)经常导致解析异常。

字段包含分隔符时需转义:当数据本身包含逗号或换行时,需要用引号包裹,转义规则容易出错。


怎么选择合适的格式?

场景推荐格式原因
Web API / 前后端通信JSON体积小、解析快、生态完善
配置文件(需要注释)YAML可读性高、支持注释和数据类型
企业级集成 / 强验证XMLSchema 成熟、命名空间、XSLT
数据导出 / 批量处理CSV紧凑、流式友好、工具支持好
移动端 / 低带宽JSON体积小、解析快
文档格式(Office/SVG)XML标记能力、属性支持

一句话总结:JSON 是通用数据交换的首选,YAML 是人类可读配置的首选,XML 是强验证和文档标记的首选,CSV 是表格数据处理的首选。选格式不是找"最好的",而是找"最适合当前场景的"。

标签:JSON