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 | 可读性高、支持注释和数据类型 |
| 企业级集成 / 强验证 | XML | Schema 成熟、命名空间、XSLT |
| 数据导出 / 批量处理 | CSV | 紧凑、流式友好、工具支持好 |
| 移动端 / 低带宽 | JSON | 体积小、解析快 |
| 文档格式(Office/SVG) | XML | 标记能力、属性支持 |
一句话总结:JSON 是通用数据交换的首选,YAML 是人类可读配置的首选,XML 是强验证和文档标记的首选,CSV 是表格数据处理的首选。选格式不是找"最好的",而是找"最适合当前场景的"。